1 .\" Copyright (c) 2008 Linux Foundation, written by Michael Kerrisk
2 .\" <mtk.manpages@gmail.com>
4 .\" %%%LICENSE_START(VERBATIM)
5 .\" Permission is granted to make and distribute verbatim copies of this
6 .\" manual provided the copyright notice and this permission notice are
7 .\" preserved on all copies.
9 .\" Permission is granted to copy and distribute modified versions of this
10 .\" manual under the conditions for verbatim copying, provided that the
11 .\" entire resulting derived work is distributed under the terms of a
12 .\" permission notice identical to this one.
14 .\" Since the Linux kernel and libraries are constantly changing, this
15 .\" manual page may be incorrect or out-of-date. The author(s) assume no
16 .\" responsibility for errors or omissions, or for damages resulting from
17 .\" the use of the information contained herein. The author(s) may not
18 .\" have taken the same level of care in the production of this manual,
19 .\" which is licensed free of charge, as they might when working
22 .\" Formatted or processed versions of this manual, if unaccompanied by
23 .\" the source, must acknowledge the copyright and authors of this work.
26 .TH PTHREAD_CREATE 3 2018-04-30 "Linux" "Linux Programmer's Manual"
28 pthread_create \- create a new thread
31 .B #include <pthread.h>
33 .BI "int pthread_create(pthread_t *" thread ", const pthread_attr_t *" attr ,
34 .BI " void *(*" start_routine ") (void *), void *" arg );
37 Compile and link with \fI\-pthread\fP.
41 function starts a new thread in the calling process.
42 The new thread starts execution by invoking
45 is passed as the sole argument of
48 The new thread terminates in one of the following ways:
52 specifying an exit status value that is available to another thread
53 in the same process that calls
58 This is equivalent to calling
60 with the value supplied in the
65 .BR pthread_cancel (3)).
67 Any of the threads in the process calls
69 or the main thread performs a return from
71 This causes the termination of all threads in the process.
77 structure whose contents are used at thread creation time to
78 determine attributes for the new thread;
79 this structure is initialized using
80 .BR pthread_attr_init (3)
81 and related functions.
85 then the thread is created with default attributes.
87 Before returning, a successful call to
89 stores the ID of the new thread in the buffer pointed to by
91 this identifier is used to refer to the thread
92 in subsequent calls to other pthreads functions.
94 The new thread inherits a copy of the creating thread's signal mask
95 .RB ( pthread_sigmask (3)).
96 The set of pending signals for the new thread is empty
97 .RB ( sigpending (2)).
98 The new thread does not inherit the creating thread's
99 alternate signal stack
100 .RB ( sigaltstack (2)).
102 The new thread inherits the calling thread's floating-point environment
105 The initial value of the new thread's CPU-time clock is 0
107 .BR pthread_getcpuclockid (3)).
108 .\" CLOCK_THREAD_CPUTIME_ID in clock_gettime(2)
109 .SS Linux-specific details
110 The new thread inherits copies of the calling thread's capability sets
112 .BR capabilities (7))
113 and CPU affinity mask (see
114 .BR sched_setaffinity (2)).
117 .BR pthread_create ()
119 on error, it returns an error number, and the contents of
125 Insufficient resources to create another thread.
128 .\" NOTE! The following should match the description in fork(2)
129 A system-imposed limit on the number of threads was encountered.
130 There are a number of limits that may trigger this error: the
132 soft resource limit (set via
134 which limits the number of processes and threads for a real user ID,
136 the kernel's system-wide limit on the number of processes and threads,
137 .IR /proc/sys/kernel/threads-max ,
140 or the maximum number of PIDs,
141 .IR /proc/sys/kernel/pid_max ,
149 .\" FIXME . Test the following
151 No permission to set the scheduling policy and parameters specified in
154 For an explanation of the terms used in this section, see
160 Interface Attribute Value
162 .BR pthread_create ()
163 T} Thread safety MT-Safe
167 POSIX.1-2001, POSIX.1-2008.
171 for further information on the thread ID returned in
174 .BR pthread_create ().
175 Unless real-time scheduling policies are being employed,
177 .BR pthread_create (),
178 it is indeterminate which thread\(emthe caller or the new thread\(emwill
181 A thread may either be
185 If a thread is joinable, then another thread can call
187 to wait for the thread to terminate and fetch its exit status.
188 Only when a terminated joinable thread has been joined are
189 the last of its resources released back to the system.
190 When a detached thread terminates,
191 its resources are automatically released back to the system:
192 it is not possible to join with the thread in order to obtain
194 Making a thread detached is useful for some types of daemon threads
195 whose exit status the application does not need to care about.
196 By default, a new thread is created in a joinable state, unless
198 was set to create the thread in a detached state (using
199 .BR pthread_attr_setdetachstate (3)).
201 Under the NPTL threading implementation, if the
204 .IR "at the time the program started"
205 has any value other than "unlimited",
206 then it determines the default stack size of new threads.
208 .BR pthread_attr_setstacksize (3),
209 the stack size attribute can be explicitly set in the
211 argument used to create a thread,
212 in order to obtain a stack size other than the default.
215 resource limit is set to "unlimited",
216 a per-architecture value is used for the stack size.
217 Here is the value for a few architectures:
223 Architecture Default stack size
234 In the obsolete LinuxThreads implementation,
235 each of the threads in a process has a different process ID.
236 This is in violation of the POSIX threads specification,
237 and is the source of many other nonconformances to the standard; see
240 The program below demonstrates the use of
241 .BR pthread_create (),
242 as well as a number of other functions in the pthreads API.
244 In the following run,
245 on a system providing the NPTL threading implementation,
246 the stack size defaults to the value given by the
247 "stack size" resource limit:
251 .RB "$" " ulimit \-s"
252 8192 # The stack size limit is 8 MB (0x800000 bytes)
253 .RB "$" " ./a.out hola salut servus"
254 Thread 1: top of stack near 0xb7dd03b8; argv_string=hola
255 Thread 2: top of stack near 0xb75cf3b8; argv_string=salut
256 Thread 3: top of stack near 0xb6dce3b8; argv_string=servus
257 Joined with thread 1; returned value was HOLA
258 Joined with thread 2; returned value was SALUT
259 Joined with thread 3; returned value was SERVUS
263 In the next run, the program explicitly sets a stack size of 1\ MB (using
264 .BR pthread_attr_setstacksize (3))
265 for the created threads:
269 .RB "$" " ./a.out \-s 0x100000 hola salut servus"
270 Thread 1: top of stack near 0xb7d723b8; argv_string=hola
271 Thread 2: top of stack near 0xb7c713b8; argv_string=salut
272 Thread 3: top of stack near 0xb7b703b8; argv_string=servus
273 Joined with thread 1; returned value was HOLA
274 Joined with thread 2; returned value was SALUT
275 Joined with thread 3; returned value was SERVUS
289 #define handle_error_en(en, msg) \e
290 do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
292 #define handle_error(msg) \e
293 do { perror(msg); exit(EXIT_FAILURE); } while (0)
295 struct thread_info { /* Used as argument to thread_start() */
296 pthread_t thread_id; /* ID returned by pthread_create() */
297 int thread_num; /* Application\-defined thread # */
298 char *argv_string; /* From command\-line argument */
301 /* Thread start function: display address near top of our stack,
302 and return upper\-cased copy of argv_string */
305 thread_start(void *arg)
307 struct thread_info *tinfo = arg;
310 printf("Thread %d: top of stack near %p; argv_string=%s\en",
311 tinfo\->thread_num, &p, tinfo\->argv_string);
313 uargv = strdup(tinfo\->argv_string);
315 handle_error("strdup");
317 for (p = uargv; *p != \(aq\e0\(aq; p++)
324 main(int argc, char *argv[])
326 int s, tnum, opt, num_threads;
327 struct thread_info *tinfo;
332 /* The "\-s" option specifies a stack size for our threads */
335 while ((opt = getopt(argc, argv, "s:")) != \-1) {
338 stack_size = strtoul(optarg, NULL, 0);
342 fprintf(stderr, "Usage: %s [\-s stack-size] arg...\en",
348 num_threads = argc \- optind;
350 /* Initialize thread creation attributes */
352 s = pthread_attr_init(&attr);
354 handle_error_en(s, "pthread_attr_init");
356 if (stack_size > 0) {
357 s = pthread_attr_setstacksize(&attr, stack_size);
359 handle_error_en(s, "pthread_attr_setstacksize");
362 /* Allocate memory for pthread_create() arguments */
364 tinfo = calloc(num_threads, sizeof(struct thread_info));
366 handle_error("calloc");
368 /* Create one thread for each command\-line argument */
370 for (tnum = 0; tnum < num_threads; tnum++) {
371 tinfo[tnum].thread_num = tnum + 1;
372 tinfo[tnum].argv_string = argv[optind + tnum];
374 /* The pthread_create() call stores the thread ID into
375 corresponding element of tinfo[] */
377 s = pthread_create(&tinfo[tnum].thread_id, &attr,
378 &thread_start, &tinfo[tnum]);
380 handle_error_en(s, "pthread_create");
383 /* Destroy the thread attributes object, since it is no
386 s = pthread_attr_destroy(&attr);
388 handle_error_en(s, "pthread_attr_destroy");
390 /* Now join with each thread, and display its returned value */
392 for (tnum = 0; tnum < num_threads; tnum++) {
393 s = pthread_join(tinfo[tnum].thread_id, &res);
395 handle_error_en(s, "pthread_join");
397 printf("Joined with thread %d; returned value was %s\en",
398 tinfo[tnum].thread_num, (char *) res);
399 free(res); /* Free memory allocated by thread */
410 .BR pthread_attr_init (3),
411 .BR pthread_cancel (3),
412 .BR pthread_detach (3),
413 .BR pthread_equal (3),
414 .BR pthread_exit (3),
415 .BR pthread_getattr_np (3),
416 .BR pthread_join (3),
417 .BR pthread_self (3),
418 .BR pthread_setattr_default_np (3),