man*/: Improve timestamp documentation
[man-pages.git] / man7 / pthreads.7
blob81d0db0e102c60dd12102e4302d95b76fb67ed67
1 .\" Copyright (c) 2005 by Michael Kerrisk <mtk.manpages@gmail.com>
2 .\"
3 .\" SPDX-License-Identifier: Linux-man-pages-copyleft
4 .\"
5 .TH pthreads 7 (date) "Linux man-pages (unreleased)"
6 .SH NAME
7 pthreads \- POSIX threads
8 .SH DESCRIPTION
9 POSIX.1 specifies a set of interfaces (functions, header files) for
10 threaded programming commonly known as POSIX threads, or Pthreads.
11 A single process can contain multiple threads,
12 all of which are executing the same program.
13 These threads share the same global memory (data and heap segments),
14 but each thread has its own stack (automatic variables).
16 POSIX.1 also requires that threads share a range of other attributes
17 (i.e., these attributes are process-wide rather than per-thread):
18 .IP \[bu] 3
19 process ID
20 .IP \[bu]
21 parent process ID
22 .IP \[bu]
23 process group ID and session ID
24 .IP \[bu]
25 controlling terminal
26 .IP \[bu]
27 user and group IDs
28 .IP \[bu]
29 open file descriptors
30 .IP \[bu]
31 record locks (see
32 .BR fcntl (2))
33 .IP \[bu]
34 signal dispositions
35 .IP \[bu]
36 file mode creation mask
37 .RB ( umask (2))
38 .IP \[bu]
39 current directory
40 .RB ( chdir (2))
41 and
42 root directory
43 .RB ( chroot (2))
44 .IP \[bu]
45 interval timers
46 .RB ( setitimer (2))
47 and POSIX timers
48 .RB ( timer_create (2))
49 .IP \[bu]
50 nice value
51 .RB ( setpriority (2))
52 .IP \[bu]
53 resource limits
54 .RB ( setrlimit (2))
55 .IP \[bu]
56 measurements of the consumption of CPU time
57 .RB ( times (2))
58 and resources
59 .RB ( getrusage (2))
61 As well as the stack, POSIX.1 specifies that various other
62 attributes are distinct for each thread, including:
63 .IP \[bu] 3
64 thread ID (the
65 .I pthread_t
66 data type)
67 .IP \[bu]
68 signal mask
69 .RB ( pthread_sigmask (3))
70 .IP \[bu]
71 the
72 .I errno
73 variable
74 .IP \[bu]
75 alternate signal stack
76 .RB ( sigaltstack (2))
77 .IP \[bu]
78 real-time scheduling policy and priority
79 .RB ( sched (7))
81 The following Linux-specific features are also per-thread:
82 .IP \[bu] 3
83 capabilities (see
84 .BR capabilities (7))
85 .IP \[bu]
86 CPU affinity
87 .RB ( sched_setaffinity (2))
88 .SS Pthreads function return values
89 Most pthreads functions return 0 on success, and an error number on failure.
90 The error numbers that can be returned have the same meaning as
91 the error numbers returned in
92 .I errno
93 by conventional system calls and C library functions.
94 Note that the pthreads functions do not set
95 .IR errno .
96 For each of the pthreads functions that can return an error,
97 POSIX.1-2001 specifies that the function can never fail with the error
98 .BR EINTR .
99 .SS Thread IDs
100 Each of the threads in a process has a unique thread identifier
101 (stored in the type
102 .IR pthread_t ).
103 This identifier is returned to the caller of
104 .BR pthread_create (3),
105 and a thread can obtain its own thread identifier using
106 .BR pthread_self (3).
108 Thread IDs are guaranteed to be unique only within a process.
109 (In all pthreads functions that accept a thread ID as an argument,
110 that ID by definition refers to a thread in
111 the same process as the caller.)
113 The system may reuse a thread ID after a terminated thread has been joined,
114 or a detached thread has terminated.
115 POSIX says: "If an application attempts to use a thread ID whose
116 lifetime has ended, the behavior is undefined."
117 .SS Thread-safe functions
118 A thread-safe function is one that can be safely
119 (i.e., it will deliver the same results regardless of whether it is)
120 called from multiple threads at the same time.
122 POSIX.1-2001 and POSIX.1-2008 require that all functions specified
123 in the standard shall be thread-safe,
124 except for the following functions:
126 .in +4n
128 asctime()
129 basename()
130 catgets()
131 crypt()
132 ctermid() if passed a non-NULL argument
133 ctime()
134 dbm_clearerr()
135 dbm_close()
136 dbm_delete()
137 dbm_error()
138 dbm_fetch()
139 dbm_firstkey()
140 dbm_nextkey()
141 dbm_open()
142 dbm_store()
143 dirname()
144 dlerror()
145 drand48()
146 ecvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)]
147 encrypt()
148 endgrent()
149 endpwent()
150 endutxent()
151 fcvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)]
152 ftw()
153 gcvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)]
154 getc_unlocked()
155 getchar_unlocked()
156 getdate()
157 getenv()
158 getgrent()
159 getgrgid()
160 getgrnam()
161 gethostbyaddr() [POSIX.1-2001 only (function removed in
162                  POSIX.1-2008)]
163 gethostbyname() [POSIX.1-2001 only (function removed in
164                  POSIX.1-2008)]
165 gethostent()
166 getlogin()
167 getnetbyaddr()
168 getnetbyname()
169 getnetent()
170 getopt()
171 getprotobyname()
172 getprotobynumber()
173 getprotoent()
174 getpwent()
175 getpwnam()
176 getpwuid()
177 getservbyname()
178 getservbyport()
179 getservent()
180 getutxent()
181 getutxid()
182 getutxline()
183 gmtime()
184 hcreate()
185 hdestroy()
186 hsearch()
187 inet_ntoa()
188 l64a()
189 lgamma()
190 lgammaf()
191 lgammal()
192 localeconv()
193 localtime()
194 lrand48()
195 mrand48()
196 nftw()
197 nl_langinfo()
198 ptsname()
199 putc_unlocked()
200 putchar_unlocked()
201 putenv()
202 pututxline()
203 rand()
204 readdir()
205 setenv()
206 setgrent()
207 setkey()
208 setpwent()
209 setutxent()
210 strerror()
211 strsignal() [Added in POSIX.1-2008]
212 strtok()
213 system() [Added in POSIX.1-2008]
214 tmpnam() if passed a non-NULL argument
215 ttyname()
216 unsetenv()
217 wcrtomb() if its final argument is NULL
218 wcsrtombs() if its final argument is NULL
219 wcstombs()
220 wctomb()
223 .SS Async-cancel-safe functions
224 An async-cancel-safe function is one that can be safely called
225 in an application where asynchronous cancelability is enabled (see
226 .BR pthread_setcancelstate (3)).
228 Only the following functions are required to be async-cancel-safe by
229 POSIX.1-2001 and POSIX.1-2008:
231 .in +4n
233 pthread_cancel()
234 pthread_setcancelstate()
235 pthread_setcanceltype()
238 .SS Cancelation points
239 POSIX.1 specifies that certain functions must,
240 and certain other functions may, be cancelation points.
241 If a thread is cancelable, its cancelability type is deferred,
242 and a cancelation request is pending for the thread,
243 then the thread is canceled when it calls a function
244 that is a cancelation point.
246 The following functions are required to be cancelation points by
247 POSIX.1-2001 and/or POSIX.1-2008:
249 .\" FIXME
250 .\" Document the list of all functions that are cancelation points in glibc
251 .in +4n
253 accept()
254 aio_suspend()
255 clock_nanosleep()
256 close()
257 connect()
258 creat()
259 fcntl() F_SETLKW
260 fdatasync()
261 fsync()
262 getmsg()
263 getpmsg()
264 lockf() F_LOCK
265 mq_receive()
266 mq_send()
267 mq_timedreceive()
268 mq_timedsend()
269 msgrcv()
270 msgsnd()
271 msync()
272 nanosleep()
273 open()
274 openat() [Added in POSIX.1-2008]
275 pause()
276 poll()
277 pread()
278 pselect()
279 pthread_cond_timedwait()
280 pthread_cond_wait()
281 pthread_join()
282 pthread_testcancel()
283 putmsg()
284 putpmsg()
285 pwrite()
286 read()
287 readv()
288 recv()
289 recvfrom()
290 recvmsg()
291 select()
292 sem_timedwait()
293 sem_wait()
294 send()
295 sendmsg()
296 sendto()
297 sigpause() [POSIX.1-2001 only (moves to "may" list in POSIX.1-2008)]
298 sigsuspend()
299 sigtimedwait()
300 sigwait()
301 sigwaitinfo()
302 sleep()
303 system()
304 tcdrain()
305 usleep() [POSIX.1-2001 only (function removed in POSIX.1-2008)]
306 wait()
307 waitid()
308 waitpid()
309 write()
310 writev()
314 The following functions may be cancelation points according to
315 POSIX.1-2001 and/or POSIX.1-2008:
317 .in +4n
319 access()
320 asctime()
321 asctime_r()
322 catclose()
323 catgets()
324 catopen()
325 chmod() [Added in POSIX.1-2008]
326 chown() [Added in POSIX.1-2008]
327 closedir()
328 closelog()
329 ctermid()
330 ctime()
331 ctime_r()
332 dbm_close()
333 dbm_delete()
334 dbm_fetch()
335 dbm_nextkey()
336 dbm_open()
337 dbm_store()
338 dlclose()
339 dlopen()
340 dprintf() [Added in POSIX.1-2008]
341 endgrent()
342 endhostent()
343 endnetent()
344 endprotoent()
345 endpwent()
346 endservent()
347 endutxent()
348 faccessat() [Added in POSIX.1-2008]
349 fchmod() [Added in POSIX.1-2008]
350 fchmodat() [Added in POSIX.1-2008]
351 fchown() [Added in POSIX.1-2008]
352 fchownat() [Added in POSIX.1-2008]
353 fclose()
354 fcntl() (for any value of cmd argument)
355 fflush()
356 fgetc()
357 fgetpos()
358 fgets()
359 fgetwc()
360 fgetws()
361 fmtmsg()
362 fopen()
363 fpathconf()
364 fprintf()
365 fputc()
366 fputs()
367 fputwc()
368 fputws()
369 fread()
370 freopen()
371 fscanf()
372 fseek()
373 fseeko()
374 fsetpos()
375 fstat()
376 fstatat() [Added in POSIX.1-2008]
377 ftell()
378 ftello()
379 ftw()
380 futimens() [Added in POSIX.1-2008]
381 fwprintf()
382 fwrite()
383 fwscanf()
384 getaddrinfo()
385 getc()
386 getc_unlocked()
387 getchar()
388 getchar_unlocked()
389 getcwd()
390 getdate()
391 getdelim() [Added in POSIX.1-2008]
392 getgrent()
393 getgrgid()
394 getgrgid_r()
395 getgrnam()
396 getgrnam_r()
397 gethostbyaddr() [POSIX.1-2001 only (function removed in
398                  POSIX.1-2008)]
399 gethostbyname() [POSIX.1-2001 only (function removed in
400                  POSIX.1-2008)]
401 gethostent()
402 gethostid()
403 gethostname()
404 getline() [Added in POSIX.1-2008]
405 getlogin()
406 getlogin_r()
407 getnameinfo()
408 getnetbyaddr()
409 getnetbyname()
410 getnetent()
411 getopt() (if opterr is nonzero)
412 getprotobyname()
413 getprotobynumber()
414 getprotoent()
415 getpwent()
416 getpwnam()
417 getpwnam_r()
418 getpwuid()
419 getpwuid_r()
420 gets()
421 getservbyname()
422 getservbyport()
423 getservent()
424 getutxent()
425 getutxid()
426 getutxline()
427 getwc()
428 getwchar()
429 getwd() [POSIX.1-2001 only (function removed in POSIX.1-2008)]
430 glob()
431 iconv_close()
432 iconv_open()
433 ioctl()
434 link()
435 linkat() [Added in POSIX.1-2008]
436 lio_listio() [Added in POSIX.1-2008]
437 localtime()
438 localtime_r()
439 lockf() [Added in POSIX.1-2008]
440 lseek()
441 lstat()
442 mkdir() [Added in POSIX.1-2008]
443 mkdirat() [Added in POSIX.1-2008]
444 mkdtemp() [Added in POSIX.1-2008]
445 mkfifo() [Added in POSIX.1-2008]
446 mkfifoat() [Added in POSIX.1-2008]
447 mknod() [Added in POSIX.1-2008]
448 mknodat() [Added in POSIX.1-2008]
449 mkstemp()
450 mktime()
451 nftw()
452 opendir()
453 openlog()
454 pathconf()
455 pclose()
456 perror()
457 popen()
458 posix_fadvise()
459 posix_fallocate()
460 posix_madvise()
461 posix_openpt()
462 posix_spawn()
463 posix_spawnp()
464 posix_trace_clear()
465 posix_trace_close()
466 posix_trace_create()
467 posix_trace_create_withlog()
468 posix_trace_eventtypelist_getnext_id()
469 posix_trace_eventtypelist_rewind()
470 posix_trace_flush()
471 posix_trace_get_attr()
472 posix_trace_get_filter()
473 posix_trace_get_status()
474 posix_trace_getnext_event()
475 posix_trace_open()
476 posix_trace_rewind()
477 posix_trace_set_filter()
478 posix_trace_shutdown()
479 posix_trace_timedgetnext_event()
480 posix_typed_mem_open()
481 printf()
482 psiginfo() [Added in POSIX.1-2008]
483 psignal() [Added in POSIX.1-2008]
484 pthread_rwlock_rdlock()
485 pthread_rwlock_timedrdlock()
486 pthread_rwlock_timedwrlock()
487 pthread_rwlock_wrlock()
488 putc()
489 putc_unlocked()
490 putchar()
491 putchar_unlocked()
492 puts()
493 pututxline()
494 putwc()
495 putwchar()
496 readdir()
497 readdir_r()
498 readlink() [Added in POSIX.1-2008]
499 readlinkat() [Added in POSIX.1-2008]
500 remove()
501 rename()
502 renameat() [Added in POSIX.1-2008]
503 rewind()
504 rewinddir()
505 scandir() [Added in POSIX.1-2008]
506 scanf()
507 seekdir()
508 semop()
509 setgrent()
510 sethostent()
511 setnetent()
512 setprotoent()
513 setpwent()
514 setservent()
515 setutxent()
516 sigpause() [Added in POSIX.1-2008]
517 stat()
518 strerror()
519 strerror_r()
520 strftime()
521 symlink()
522 symlinkat() [Added in POSIX.1-2008]
523 sync()
524 syslog()
525 tmpfile()
526 tmpnam()
527 ttyname()
528 ttyname_r()
529 tzset()
530 ungetc()
531 ungetwc()
532 unlink()
533 unlinkat() [Added in POSIX.1-2008]
534 utime() [Added in POSIX.1-2008]
535 utimensat() [Added in POSIX.1-2008]
536 utimes() [Added in POSIX.1-2008]
537 vdprintf() [Added in POSIX.1-2008]
538 vfprintf()
539 vfwprintf()
540 vprintf()
541 vwprintf()
542 wcsftime()
543 wordexp()
544 wprintf()
545 wscanf()
549 An implementation may also mark other functions
550 not specified in the standard as cancelation points.
551 In particular, an implementation is likely to mark
552 any nonstandard function that may block as a cancelation point.
553 (This includes most functions that can touch files.)
555 It should be noted that even if an application is not using
556 asynchronous cancelation, that calling a function from the above list
557 from an asynchronous signal handler may cause the equivalent of
558 asynchronous cancelation.
559 The underlying user code may not expect
560 asynchronous cancelation and the state of the user data may become
561 inconsistent.
562 Therefore signals should be used with caution when
563 entering a region of deferred cancelation.
564 .\" So, scanning "cancelation point" comments in the glibc 2.8 header
565 .\" files, it looks as though at least the following nonstandard
566 .\" functions are cancelation points:
567 .\" endnetgrent
568 .\" endspent
569 .\" epoll_pwait
570 .\" epoll_wait
571 .\" fcloseall
572 .\" fdopendir
573 .\" fflush_unlocked
574 .\" fgetc_unlocked
575 .\" fgetgrent
576 .\" fgetgrent_r
577 .\" fgetpwent
578 .\" fgetpwent_r
579 .\" fgets_unlocked
580 .\" fgetspent
581 .\" fgetspent_r
582 .\" fgetwc_unlocked
583 .\" fgetws_unlocked
584 .\" fputc_unlocked
585 .\" fputs_unlocked
586 .\" fputwc_unlocked
587 .\" fputws_unlocked
588 .\" fread_unlocked
589 .\" fwrite_unlocked
590 .\" gai_suspend
591 .\" getaddrinfo_a
592 .\" getdate_r
593 .\" getgrent_r
594 .\" getgrouplist
595 .\" gethostbyaddr_r
596 .\" gethostbyname2
597 .\" gethostbyname2_r
598 .\" gethostbyname_r
599 .\" gethostent_r
600 .\" getnetbyaddr_r
601 .\" getnetbyname_r
602 .\" getnetent_r
603 .\" getnetgrent
604 .\" getnetgrent_r
605 .\" getprotobyname_r
606 .\" getprotobynumber_r
607 .\" getprotoent_r
608 .\" getpw
609 .\" getpwent_r
610 .\" getservbyname_r
611 .\" getservbyport_r
612 .\" getservent_r
613 .\" getspent
614 .\" getspent_r
615 .\" getspnam
616 .\" getspnam_r
617 .\" getutmp
618 .\" getutmpx
619 .\" getw
620 .\" getwc_unlocked
621 .\" getwchar_unlocked
622 .\" initgroups
623 .\" innetgr
624 .\" mkostemp
625 .\" mkostemp64
626 .\" mkstemp64
627 .\" ppoll
628 .\" pthread_timedjoin_np
629 .\" putgrent
630 .\" putpwent
631 .\" putspent
632 .\" putw
633 .\" putwc_unlocked
634 .\" putwchar_unlocked
635 .\" rcmd
636 .\" rcmd_af
637 .\" rexec
638 .\" rexec_af
639 .\" rresvport
640 .\" rresvport_af
641 .\" ruserok
642 .\" ruserok_af
643 .\" setnetgrent
644 .\" setspent
645 .\" sgetspent
646 .\" sgetspent_r
647 .\" updwtmpx
648 .\" utmpxname
649 .\" vfscanf
650 .\" vfwscanf
651 .\" vscanf
652 .\" vsyslog
653 .\" vwscanf
654 .SS Compiling on Linux
655 On Linux, programs that use the Pthreads API should be compiled using
656 .IR "cc \-pthread" .
657 .SS Linux implementations of POSIX threads
658 Over time, two threading implementations have been provided by
659 the GNU C library on Linux:
661 .B LinuxThreads
662 This is the original Pthreads implementation.
663 Since glibc 2.4, this implementation is no longer supported.
665 .BR NPTL " (Native POSIX Threads Library)"
666 This is the modern Pthreads implementation.
667 By comparison with LinuxThreads, NPTL provides closer conformance to
668 the requirements of the POSIX.1 specification and better performance
669 when creating large numbers of threads.
670 NPTL is available since glibc 2.3.2,
671 and requires features that are present in the Linux 2.6 kernel.
673 Both of these are so-called 1:1 implementations, meaning that each
674 thread maps to a kernel scheduling entity.
675 Both threading implementations employ the Linux
676 .BR clone (2)
677 system call.
678 In NPTL, thread synchronization primitives (mutexes,
679 thread joining, and so on) are implemented using the Linux
680 .BR futex (2)
681 system call.
682 .SS LinuxThreads
683 The notable features of this implementation are the following:
684 .IP \[bu] 3
685 In addition to the main (initial) thread,
686 and the threads that the program creates using
687 .BR pthread_create (3),
688 the implementation creates a "manager" thread.
689 This thread handles thread creation and termination.
690 (Problems can result if this thread is inadvertently killed.)
691 .IP \[bu]
692 Signals are used internally by the implementation.
693 On Linux 2.2 and later, the first three real-time signals are used
694 (see also
695 .BR signal (7)).
696 On older Linux kernels,
697 .B SIGUSR1
699 .B SIGUSR2
700 are used.
701 Applications must avoid the use of whichever set of signals is
702 employed by the implementation.
703 .IP \[bu]
704 Threads do not share process IDs.
705 (In effect, LinuxThreads threads are implemented as processes which share
706 more information than usual, but which do not share a common process ID.)
707 LinuxThreads threads (including the manager thread)
708 are visible as separate processes using
709 .BR ps (1).
711 The LinuxThreads implementation deviates from the POSIX.1
712 specification in a number of ways, including the following:
713 .IP \[bu] 3
714 Calls to
715 .BR getpid (2)
716 return a different value in each thread.
717 .IP \[bu]
718 Calls to
719 .BR getppid (2)
720 in threads other than the main thread return the process ID of the
721 manager thread; instead
722 .BR getppid (2)
723 in these threads should return the same value as
724 .BR getppid (2)
725 in the main thread.
726 .IP \[bu]
727 When one thread creates a new child process using
728 .BR fork (2),
729 any thread should be able to
730 .BR wait (2)
731 on the child.
732 However, the implementation allows only the thread that
733 created the child to
734 .BR wait (2)
735 on it.
736 .IP \[bu]
737 When a thread calls
738 .BR execve (2),
739 all other threads are terminated (as required by POSIX.1).
740 However, the resulting process has the same PID as the thread that called
741 .BR execve (2):
742 it should have the same PID as the main thread.
743 .IP \[bu]
744 Threads do not share user and group IDs.
745 This can cause complications with set-user-ID programs and
746 can cause failures in Pthreads functions if an application
747 changes its credentials using
748 .BR seteuid (2)
749 or similar.
750 .IP \[bu]
751 Threads do not share a common session ID and process group ID.
752 .IP \[bu]
753 Threads do not share record locks created using
754 .BR fcntl (2).
755 .IP \[bu]
756 The information returned by
757 .BR times (2)
759 .BR getrusage (2)
760 is per-thread rather than process-wide.
761 .IP \[bu]
762 Threads do not share semaphore undo values (see
763 .BR semop (2)).
764 .IP \[bu]
765 Threads do not share interval timers.
766 .IP \[bu]
767 Threads do not share a common nice value.
768 .IP \[bu]
769 POSIX.1 distinguishes the notions of signals that are directed
770 to the process as a whole and signals that are directed to individual
771 threads.
772 According to POSIX.1, a process-directed signal (sent using
773 .BR kill (2),
774 for example) should be handled by a single,
775 arbitrarily selected thread within the process.
776 LinuxThreads does not support the notion of process-directed signals:
777 signals may be sent only to specific threads.
778 .IP \[bu]
779 Threads have distinct alternate signal stack settings.
780 However, a new thread's alternate signal stack settings
781 are copied from the thread that created it, so that
782 the threads initially share an alternate signal stack.
783 (A new thread should start with no alternate signal stack defined.
784 If two threads handle signals on their shared alternate signal
785 stack at the same time, unpredictable program failures are
786 likely to occur.)
787 .SS NPTL
788 With NPTL, all of the threads in a process are placed
789 in the same thread group;
790 all members of a thread group share the same PID.
791 NPTL does not employ a manager thread.
793 NPTL makes internal use of the first two real-time signals;
794 these signals cannot be used in applications.
796 .BR nptl (7)
797 for further details.
799 NPTL still has at least one nonconformance with POSIX.1:
800 .IP \[bu] 3
801 Threads do not share a common nice value.
802 .\" FIXME . bug report filed for NPTL nice nonconformance
803 .\" http://bugzilla.kernel.org/show_bug.cgi?id=6258
804 .\" Sep 08: there is a patch by Denys Vlasenko to address this
805 .\" "make setpriority POSIX compliant; introduce PRIO_THREAD extension"
806 .\" Monitor this to see if it makes it into mainline.
808 Some NPTL nonconformances occur only with older kernels:
809 .IP \[bu] 3
810 The information returned by
811 .BR times (2)
813 .BR getrusage (2)
814 is per-thread rather than process-wide (fixed in Linux 2.6.9).
815 .IP \[bu]
816 Threads do not share resource limits (fixed in Linux 2.6.10).
817 .IP \[bu]
818 Threads do not share interval timers (fixed in Linux 2.6.12).
819 .IP \[bu]
820 Only the main thread is permitted to start a new session using
821 .BR setsid (2)
822 (fixed in Linux 2.6.16).
823 .IP \[bu]
824 Only the main thread is permitted to make the process into a
825 process group leader using
826 .BR setpgid (2)
827 (fixed in Linux 2.6.16).
828 .IP \[bu]
829 Threads have distinct alternate signal stack settings.
830 However, a new thread's alternate signal stack settings
831 are copied from the thread that created it, so that
832 the threads initially share an alternate signal stack
833 (fixed in Linux 2.6.16).
835 Note the following further points about the NPTL implementation:
836 .IP \[bu] 3
837 If the stack size soft resource limit (see the description of
838 .B RLIMIT_STACK
840 .BR setrlimit (2))
841 is set to a value other than
842 .IR unlimited ,
843 then this value defines the default stack size for new threads.
844 To be effective, this limit must be set before the program
845 is executed, perhaps using the
846 .I ulimit \-s
847 shell built-in command
848 .RI ( "limit stacksize"
849 in the C shell).
850 .SS Determining the threading implementation
851 Since glibc 2.3.2, the
852 .BR getconf (1)
853 command can be used to determine
854 the system's threading implementation, for example:
856 .in +4n
858 bash$ getconf GNU_LIBPTHREAD_VERSION
859 NPTL 2.3.4
863 With older glibc versions, a command such as the following should
864 be sufficient to determine the default threading implementation:
866 .in +4n
868 bash$ $( ldd /bin/ls | grep libc.so | awk \[aq]{print $3}\[aq] ) | \e
869                 egrep \-i \[aq]threads|nptl\[aq]
870         Native POSIX Threads Library by Ulrich Drepper et al
873 .SS Selecting the threading implementation: LD_ASSUME_KERNEL
874 On systems with a glibc that supports both LinuxThreads and NPTL
875 (i.e., glibc 2.3.\fIx\fP), the
876 .B LD_ASSUME_KERNEL
877 environment variable can be used to override
878 the dynamic linker's default choice of threading implementation.
879 This variable tells the dynamic linker to assume that it is
880 running on top of a particular kernel version.
881 By specifying a kernel version that does not
882 provide the support required by NPTL, we can force the use
883 of LinuxThreads.
884 (The most likely reason for doing this is to run a
885 (broken) application that depends on some nonconformant behavior
886 in LinuxThreads.)
887 For example:
889 .in +4n
891 bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so | \e
892                 awk \[aq]{print $3}\[aq] ) | egrep \-i \[aq]threads|nptl\[aq]
893         linuxthreads\-0.10 by Xavier Leroy
896 .SH SEE ALSO
897 .ad l
899 .BR clone (2),
900 .BR fork (2),
901 .BR futex (2),
902 .BR gettid (2),
903 .BR proc (5),
904 .BR attributes (7),
905 .BR futex (7),
906 .BR nptl (7),
907 .BR sigevent (3type),
908 .BR signal (7)
910 Various Pthreads manual pages, for example:
911 .BR pthread_atfork (3),
912 .BR pthread_attr_init (3),
913 .BR pthread_cancel (3),
914 .BR pthread_cleanup_push (3),
915 .BR pthread_cond_signal (3),
916 .BR pthread_cond_wait (3),
917 .BR pthread_create (3),
918 .BR pthread_detach (3),
919 .BR pthread_equal (3),
920 .BR pthread_exit (3),
921 .BR pthread_key_create (3),
922 .BR pthread_kill (3),
923 .BR pthread_mutex_lock (3),
924 .BR pthread_mutex_unlock (3),
925 .BR pthread_mutexattr_destroy (3),
926 .BR pthread_mutexattr_init (3),
927 .BR pthread_once (3),
928 .BR pthread_spin_init (3),
929 .BR pthread_spin_lock (3),
930 .BR pthread_rwlockattr_setkind_np (3),
931 .BR pthread_setcancelstate (3),
932 .BR pthread_setcanceltype (3),
933 .BR pthread_setspecific (3),
934 .BR pthread_sigmask (3),
935 .BR pthread_sigqueue (3),
937 .BR pthread_testcancel (3)