summaryrefslogtreecommitdiffstats
path: root/man3p/pthread_create.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man3p/pthread_create.3p')
-rw-r--r--man3p/pthread_create.3p191
1 files changed, 191 insertions, 0 deletions
diff --git a/man3p/pthread_create.3p b/man3p/pthread_create.3p
new file mode 100644
index 000000000..4e4c1ef6e
--- /dev/null
+++ b/man3p/pthread_create.3p
@@ -0,0 +1,191 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "PTHREAD_CREATE" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" pthread_create
+.SH NAME
+pthread_create \- thread creation
+.SH SYNOPSIS
+.LP
+\fB#include <pthread.h>
+.br
+.sp
+int pthread_create(pthread_t *restrict\fP \fIthread\fP\fB,
+.br
+\ \ \ \ \ \ const pthread_attr_t *restrict\fP \fIattr\fP\fB,
+.br
+\ \ \ \ \ \ void *(*\fP\fIstart_routine\fP\fB)(void*), void *restrict\fP
+\fIarg\fP\fB); \fP
+\fB
+.br
+\fP
+.SH DESCRIPTION
+.LP
+The \fIpthread_create\fP() function shall create a new thread, with
+attributes specified by \fIattr\fP, within a process. If
+\fIattr\fP is NULL, the default attributes shall be used. If the attributes
+specified by \fIattr\fP are modified later, the
+thread's attributes shall not be affected. Upon successful completion,
+\fIpthread_create\fP() shall store the ID of the created
+thread in the location referenced by \fIthread\fP.
+.LP
+The thread is created executing \fIstart_routine\fP with \fIarg\fP
+as its sole argument. If the \fIstart_routine\fP returns,
+the effect shall be as if there was an implicit call to \fIpthread_exit\fP()
+using
+the return value of \fIstart_routine\fP as the exit status. Note that
+the thread in which \fImain\fP() was originally invoked
+differs from this. When it returns from \fImain\fP(), the effect shall
+be as if there was an implicit call to \fIexit\fP() using the return
+value of \fImain\fP() as the exit status.
+.LP
+The signal state of the new thread shall be initialized as follows:
+.IP " *" 3
+The signal mask shall be inherited from the creating thread.
+.LP
+.IP " *" 3
+The set of signals pending for the new thread shall be empty.
+.LP
+.LP
+The alternate stack shall not be inherited.
+.LP
+The floating-point environment shall be inherited from the creating
+thread.
+.LP
+If \fIpthread_create\fP() fails, no new thread is created and the
+contents of the location referenced by \fIthread\fP are
+undefined.
+.LP
+If _POSIX_THREAD_CPUTIME is defined, the new thread shall have a CPU-time
+clock accessible, and the initial value of this clock
+shall be set to zero.
+.SH RETURN VALUE
+.LP
+If successful, the \fIpthread_create\fP() function shall return zero;
+otherwise, an error number shall be returned to indicate
+the error.
+.SH ERRORS
+.LP
+The \fIpthread_create\fP() function shall fail if:
+.TP 7
+.B EAGAIN
+The system lacked the necessary resources to create another thread,
+or the system-imposed limit on the total number of threads
+in a process {PTHREAD_THREADS_MAX} would be exceeded.
+.TP 7
+.B EINVAL
+The value specified by \fIattr\fP is invalid.
+.TP 7
+.B EPERM
+The caller does not have appropriate permission to set the required
+scheduling parameters or scheduling policy.
+.sp
+.LP
+The \fIpthread_create\fP() function shall not return an error code
+of [EINTR].
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+A suggested alternative to \fIpthread_create\fP() would be to define
+two separate operations: create and start. Some
+applications would find such behavior more natural. Ada, in particular,
+separates the "creation" of a task from its
+"activation".
+.LP
+Splitting the operation was rejected by the standard developers for
+many reasons:
+.IP " *" 3
+The number of calls required to start a thread would increase from
+one to two and thus place an additional burden on
+applications that do not require the additional synchronization. The
+second call, however, could be avoided by the additional
+complication of a start-up state attribute.
+.LP
+.IP " *" 3
+An extra state would be introduced: "created but not started". This
+would require the standard to specify the behavior of the
+thread operations when the target has not yet started executing.
+.LP
+.IP " *" 3
+For those applications that require such behavior, it is possible
+to simulate the two separate steps with the facilities that
+are currently provided. The \fIstart_routine\fP() can synchronize
+by waiting on a condition variable that is signaled by the start
+operation.
+.LP
+.LP
+An Ada implementor can choose to create the thread at either of two
+points in the Ada program: when the task object is created,
+or when the task is activated (generally at a "begin"). If the first
+approach is adopted, the \fIstart_routine\fP() needs to
+wait on a condition variable to receive the order to begin "activation".
+The second approach requires no such condition variable
+or extra synchronization. In either approach, a separate Ada task
+control block would need to be created when the task object is
+created to hold rendezvous queues, and so on.
+.LP
+An extension of the preceding model would be to allow the state of
+the thread to be modified between the create and start. This
+would allow the thread attributes object to be eliminated. This has
+been rejected because:
+.IP " *" 3
+All state in the thread attributes object has to be able to be set
+for the thread. This would require the definition of
+functions to modify thread attributes. There would be no reduction
+in the number of function calls required to set up the thread.
+In fact, for an application that creates all threads using identical
+attributes, the number of function calls required to set up
+the threads would be dramatically increased. Use of a thread attributes
+object permits the application to make one set of attribute
+setting function calls. Otherwise, the set of attribute setting function
+calls needs to be made for each thread creation.
+.LP
+.IP " *" 3
+Depending on the implementation architecture, functions to set thread
+state would require kernel calls, or for other
+implementation reasons would not be able to be implemented as macros,
+thereby increasing the cost of thread creation.
+.LP
+.IP " *" 3
+The ability for applications to segregate threads by class would be
+lost.
+.LP
+.LP
+Another suggested alternative uses a model similar to that for process
+creation, such as "thread fork". The fork semantics
+would provide more flexibility and the "create" function can be implemented
+simply by doing a thread fork followed immediately by
+a call to the desired "start routine" for the thread. This alternative
+has these problems:
+.IP " *" 3
+For many implementations, the entire stack of the calling thread would
+need to be duplicated, since in many architectures there
+is no way to determine the size of the calling frame.
+.LP
+.IP " *" 3
+Efficiency is reduced since at least some part of the stack has to
+be copied, even though in most cases the thread never needs
+the copied context, since it merely calls the desired start routine.
+.LP
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIfork\fP() , \fIpthread_exit\fP() , \fIpthread_join\fP() , the Base
+Definitions volume of IEEE\ Std\ 1003.1-2001, \fI<pthread.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .