---
name: "pthread_create"
section: "3"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/pthread_create"
---

# pthread\_create(3)

create a new thread

## NAME

**pthread\_create** – create a new thread

## LIBRARY

POSIX Threads Library (libpthread, -lpthread)

## SYNOPSIS

**#include \<pthread.h\>**

*int*\

**pthread\_create**(*pthread\_t \*restrict thread*, *const pthread\_attr\_t \*restrict attr*, *void \*(\*start\_routine)(void \*)*, *void \*restrict arg*);

## DESCRIPTION

The **pthread\_create**() function is used to create a new thread, with attributes specified by *attr*, within a process. If *attr* is NULL, the default attributes are used. If the attributes specified by *attr* are modified later, the thread's attributes are not affected. Upon successful completion **pthread\_create**() will store the ID of the created thread in the location specified by *thread*.

The thread is created executing *start\_routine* with *arg* as its sole argument. If the *start\_routine* returns, the effect is as if there was an implicit call to **pthread\_exit**() using the return value of *start\_routine* as the exit status. Note that the thread in which **main**() was originally invoked differs from this. When it returns from **main**(), the effect is as if there was an implicit call to **exit**() using the return value of **main**() as the exit status.

The signal state of the new thread is initialized as:

- The signal mask is inherited from the creating thread.

- The set of signals pending for the new thread is empty.

## RETURN VALUES

If successful, the **pthread\_create**() function will return zero. Otherwise an error number will be returned to indicate the error.

## ERRORS

The **pthread\_create**() function can return any of the following errors:

- \[ENOMEM\]

  The system lacked the necessary resources to create another thread.

- \[EAGAIN\]

  The system-imposed limit on the total number of threads in a process \[PTHREAD\_THREADS\_MAX\] would be exceeded.

- \[EAGAIN\]

  The RACCT\_NTHR limit would be exceeded; see [rctl\_get\_racct(2)](/rctl_get_racct/2.md).

- \[EPERM\]

  The caller does not have permission to set the scheduling parameters or scheduling policy.

- \[EINVAL\]

  A value specified by *attr* is invalid.

- \[EDEADLK\]

  The CPU set specified by *attr* would prevent the thread from running on any CPU.

- \[EFAULT\]

  The stack base specified by *attr* is invalid, or the kernel was unable to put required initial data on the stack.

## SEE ALSO

[cpuset\_setaffinity(2)](/cpuset_setaffinity/2.md), [fork(2)](/fork/2.md), [rctl\_get\_racct(2)](/rctl_get_racct/2.md), [thr\_new(2)](/thr_new/2.md), [pthread\_attr(3)](/pthread_attr/3.md), [pthread\_cancel(3)](/pthread_cancel/3.md), [pthread\_cleanup\_pop(3)](/pthread_cleanup_pop/3.md), [pthread\_cleanup\_push(3)](/pthread_cleanup_push/3.md), [pthread\_exit(3)](/pthread_exit/3.md), [pthread\_join(3)](/pthread_join/3.md)

## STANDARDS

The **pthread\_create**() function conforms to ISO/IEC 9945-1:1996 (“POSIX.1”).
