OSDN Git Service

d73491bac24ba56b2d616a06d6d965c967040959
[linuxjm/LDP_man-pages.git] / release / man7 / pthreads.7
1 '\" t
2 .\" Copyright (c) 2005 by Michael Kerrisk <mtk.manpages@gmail.com>
3 .\"
4 .\" Permission is granted to make and distribute verbatim copies of this
5 .\" manual provided the copyright notice and this permission notice are
6 .\" preserved on all copies.
7 .\"
8 .\" Permission is granted to copy and distribute modified versions of this
9 .\" manual under the conditions for verbatim copying, provided that the
10 .\" entire resulting derived work is distributed under the terms of a
11 .\" permission notice identical to this one.
12 .\"
13 .\" Since the Linux kernel and libraries are constantly changing, this
14 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
15 .\" responsibility for errors or omissions, or for damages resulting from
16 .\" the use of the information contained herein.  The author(s) may not
17 .\" have taken the same level of care in the production of this manual,
18 .\" which is licensed free of charge, as they might when working
19 .\" professionally.
20 .\"
21 .\" Formatted or processed versions of this manual, if unaccompanied by
22 .\" the source, must acknowledge the copyright and authors of this work.
23 .\"
24 .\" Japanese Version Copyright (c) 2005 Akihiro MOTOKI all rights reserved.
25 .\" Translated 2005-09-06, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
26 .\" Updated 2006-04-15, Akihiro MOTOKI, LDP v2.29
27 .\" Updated 2007-01-05, Akihiro MOTOKI, LDP v2.43
28 .\" Updated 2008-08-08, Akihiro MOTOKI, LDP v3.05
29 .\" Updated 2008-11-05, Akihiro MOTOKI, LDP v3.12
30 .\" Updated 2008-11-09, Akihiro MOTOKI, LDP v3.13
31 .\" Updated 2008-12-26, Akihiro MOTOKI, LDP v3.14
32 .\"
33 .\"WORD:        manager thread          管理スレッド
34 .\"WORD:        thread group            スレッド・グループ
35 .\"WORD:        real-time signal        リアルタイムシグナル
36 .\"WORD:        non-conformant          標準非準拠の
37 .\"WORD:        alternate signal stack  代替シグナルスタック
38 .\"
39 .TH PTHREADS 7  2008-11-18 "Linux" "Linux Programmer's Manual"
40 .SH 名前
41 pthreads \- POSIX スレッド
42 .SH 説明
43 POSIX.1 は、一般に POSIX スレッドや Pthreads として知られる
44 スレッド・プログラミングのインタフェース群 (関数、ヘッダファイル)
45 を規定している。一つのプロセスは複数のスレッドを持つことができ、
46 全てのスレッドは同じプログラムを実行する。
47 これらのスレッドは同じ大域メモリ (データとヒープ領域) を共有するが、
48 各スレッドは自分専用のスタック (自動変数) を持つ。
49
50 POSIX.1 はスレッド間でどのような属性を共有するかについても定めている
51 (つまり、これらの属性はスレッド単位ではなくプロセス全体で共通である):
52 .IP \- 3
53 プロセス ID
54 .IP \- 3
55 親プロセス ID
56 .IP \- 3
57 プロセスグループ ID とセッション ID
58 .IP \- 3
59 制御端末
60 .IP \- 3
61 ユーザ ID とグループ ID
62 .IP \- 3
63 オープンするファイルディスクリプタ
64 .IP \- 3
65 レコードのロック
66 .RB ( fcntl (3)
67 参照)
68 .IP \- 3
69 シグナルの配置
70 .IP \- 3
71 ファイルモード作成マスク
72 .RB ( umask (2))
73 .IP \- 3
74 カレント・ディレクトリ
75 .RB ( chdir (2))
76 とルート・ディレクトリ
77 .RB ( chroot (2))
78 .IP \- 3
79 インターバル・タイマ
80 .RB ( setitimer (2))
81 と POSIX タイマ
82 .RB ( timer_create (2))
83 .IP \- 3
84 nice 値
85 .RB ( setpriority (2))
86 .IP \- 3
87 リソース制限
88 .RB ( setrlimit (2))
89 .IP \- 3
90 CPU 時間
91 .RB ( times (2))
92 とリソース
93 .RB ( getrusage (2))
94 の消費状況の計測
95 .PP
96 スタックについても、POSIX.1 はどのような属性が
97 個々のスレッドで独立に管理されるかを規定している:
98 .IP \- 3
99 スレッド ID
100 .RB ( pthread_t
101 データ型)
102 .IP \- 3
103 シグナルマスク
104 .RB ( pthread_sigmask (3))
105 .IP \- 3
106 .I errno
107 変数
108 .IP \- 3
109 代替シグナルスタック
110 .RB ( sigaltstack (2))
111 .IP \- 3
112 リアルタイム・スケジューリングのポリシーと優先度
113 .RB ( sched_setscheduler (2)
114
115 .BR sched_setparam (2))
116 .PP
117 以下の Linux 特有の機能もスレッド単位である:
118 .IP \- 3
119 ケーパビリティ
120 .RB ( capabilities (7)
121 参照)
122 .IP \- 3
123 CPU affinity (親和度)
124 .RB ( sched_setaffinity (2))
125 .SS "pthreads 関数の返り値"
126 ほとんどの pthreads 関数は成功すると 0 を返し、
127 失敗した場合エラー番号を返す。
128 pthreads 関数は
129 .I errno
130 をセットしない点に注意すること。
131 POSIX.1-2001 では、
132 エラーを返す可能性のある pthreads 関数がエラー
133 .B EINTR
134 で失敗することは決してないと規定している。
135 .SS "スレッド ID"
136 あるプロセス内の各スレッドは
137 .RI ( pthread_t
138 型の) 一意なスレッド識別子を持つ。
139 この識別子は、
140 .BR pthread_create (3)
141 の呼び出し元に返される。また、スレッドは自身のスレッド識別子を
142 .BR pthread_self (3)
143 を使って取得できる。
144 スレッド ID の一意性が保証されるのは、一つのプロセス内においてのみである。
145 終了したスレッドが join された後では、スレッド ID は再利用される可能性がある。
146 スレッド ID を引き数に取る全てのスレッド関数において、
147 その ID は呼び出し元と同じプロセス内の一つのスレッドを参照する。
148 .SS "スレッドセーフな関数"
149 スレッドセーフな関数は、複数のスレッドから同時に呼び出しても安全な
150 (すなわち、同時に呼び出されたかに関わらず、同じ結果を返す) 関数のことである。
151
152 POSIX.1-2001 と POSIX.1-2008では、一部の例外を除き、
153 標準で規定されている全ての関数がスレッドセーフであることを要求している。
154 以下の関数が例外である。
155 .in +4n
156 .nf
157
158 asctime()
159 basename()
160 catgets()
161 crypt()
162 ctermid() (NULL でない引き数を渡された場合)
163 ctime()
164 dbm_clearerr()
165 dbm_close()
166 dbm_delete()
167 dbm_error()
168 dbm_fetch()
169 dbm_firstkey()
170 dbm_nextkey()
171 dbm_open()
172 dbm_store()
173 dirname()
174 dlerror()
175 drand48()
176 ecvt() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
177 encrypt()
178 endgrent()
179 endpwent()
180 endutxent()
181 fcvt() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
182 ftw()
183 gcvt() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
184 getc_unlocked()
185 getchar_unlocked()
186 getdate()
187 getenv()
188 getgrent()
189 getgrgid()
190 getgrnam()
191 gethostbyaddr() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
192 gethostbyname() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
193 gethostent()
194 getlogin()
195 getnetbyaddr()
196 getnetbyname()
197 getnetent()
198 getopt()
199 getprotobyname()
200 getprotobynumber()
201 getprotoent()
202 getpwent()
203 getpwnam()
204 getpwuid()
205 getservbyname()
206 getservbyport()
207 getservent()
208 getutxent()
209 getutxid()
210 getutxline()
211 gmtime()
212 hcreate()
213 hdestroy()
214 hsearch()
215 inet_ntoa()
216 l64a()
217 lgamma()
218 lgammaf()
219 lgammal()
220 localeconv()
221 localtime()
222 lrand48()
223 mrand48()
224 nftw()
225 nl_langinfo()
226 ptsname()
227 putc_unlocked()
228 putchar_unlocked()
229 putenv()
230 pututxline()
231 rand()
232 readdir()
233 setenv()
234 setgrent()
235 setkey()
236 setpwent()
237 setutxent()
238 strerror()
239 strsignal() [POSIX.1-2008 で追加された]
240 strtok()
241 system() [POSIX.1-2008 で追加された]
242 tmpnam() (NULL でない引き数を渡された場合)
243 ttyname()
244 unsetenv()
245 wcrtomb() (最後の引き数が NULL の場合)
246 wcsrtombs() (最後の引き数が NULL の場合)
247 wcstombs()
248 wctomb()
249 .fi
250 .in
251 .SS 取り消しポイント (cancellation points)
252 POSIX.1 の規定では、特定の関数は取り消しポイントでなければならず、
253 他の特定の関数は取り消しポイントであってもよいとされている。
254 あるスレッドが取り消し可能で、その取り消し種別 (cancelability type)
255 が延期 (deferred) で、そのスレッドに対する取り消し要求が処理待ちの場合、
256 取り消しポイントである関数を呼び出した時点で、そのスレッドのキャンセルが
257 行われる。
258
259 POSIX.1-2001 と POSIX.1-2008 の両方、もしくはいずれか一方では、
260 以下の関数は、取り消しポイント (cancellation points) で
261 あることが必須となっている。
262
263 .\" FIXME
264 .\" Document the list of all functions that are cancellation points in glibc
265 .in +4n
266 .nf
267 accept()
268 aio_suspend()
269 clock_nanosleep()
270 close()
271 connect()
272 creat()
273 fcntl() F_SETLKW
274 fdatasync()
275 fsync()
276 getmsg()
277 getpmsg()
278 lockf() F_LOCK
279 mq_receive()
280 mq_send()
281 mq_timedreceive()
282 mq_timedsend()
283 msgrcv()
284 msgsnd()
285 msync()
286 nanosleep()
287 open()
288 openat() [POSIX.1-2008 で追加された]
289 pause()
290 poll()
291 pread()
292 pselect()
293 pthread_cond_timedwait()
294 pthread_cond_wait()
295 pthread_join()
296 pthread_testcancel()
297 putmsg()
298 putpmsg()
299 pwrite()
300 read()
301 readv()
302 recv()
303 recvfrom()
304 recvmsg()
305 select()
306 sem_timedwait()
307 sem_wait()
308 send()
309 sendmsg()
310 sendto()
311 sigpause() [POSIX.1-2001 only (moves to "may" list in POSIX.1-2008)]
312 sigsuspend()
313 sigtimedwait()
314 sigwait()
315 sigwaitinfo()
316 sleep()
317 system()
318 tcdrain()
319 usleep() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
320 wait()
321 waitid()
322 waitpid()
323 write()
324 writev()
325 .fi
326 .in
327
328 POSIX.1-2001 と POSIX.1-2008 の両方、もしくはいずれか一方では、
329 以下の関数は、取り消しポイント (cancellation points) で
330 あってもよいことになっている。
331
332 .in +4n
333 .nf
334 access()
335 asctime()
336 asctime_r()
337 catclose()
338 catgets()
339 catopen()
340 chmod() [POSIX.1-2008 で追加された]
341 chown() [POSIX.1-2008 で追加された]
342 closedir()
343 closelog()
344 ctermid()
345 ctime()
346 ctime_r()
347 dbm_close()
348 dbm_delete()
349 dbm_fetch()
350 dbm_nextkey()
351 dbm_open()
352 dbm_store()
353 dlclose()
354 dlopen()
355 dprintf() [POSIX.1-2008 で追加された]
356 endgrent()
357 endhostent()
358 endnetent()
359 endprotoent()
360 endpwent()
361 endservent()
362 endutxent()
363 faccessat() [POSIX.1-2008 で追加された]
364 fchmod() [POSIX.1-2008 で追加された]
365 fchmodat() [POSIX.1-2008 で追加された]
366 fchown() [POSIX.1-2008 で追加された]
367 fchownat() [POSIX.1-2008 で追加された]
368 fclose()
369 fcntl() (cmd 引き数が何であっても)
370 fflush()
371 fgetc()
372 fgetpos()
373 fgets()
374 fgetwc()
375 fgetws()
376 fmtmsg()
377 fopen()
378 fpathconf()
379 fprintf()
380 fputc()
381 fputs()
382 fputwc()
383 fputws()
384 fread()
385 freopen()
386 fscanf()
387 fseek()
388 fseeko()
389 fsetpos()
390 fstat()
391 fstatat() [POSIX.1-2008 で追加された]
392 ftell()
393 ftello()
394 ftw()
395 futimens() [POSIX.1-2008 で追加された]
396 fwprintf()
397 fwrite()
398 fwscanf()
399 getaddrinfo()
400 getc()
401 getc_unlocked()
402 getchar()
403 getchar_unlocked()
404 getcwd()
405 getdate()
406 getdelim() [POSIX.1-2008 で追加された]
407 getgrent()
408 getgrgid()
409 getgrgid_r()
410 getgrnam()
411 getgrnam_r()
412 gethostbyaddr() [SUSv3 のみ (この関数は POSIX.1-2008 で削除されている)]
413 gethostbyname() [SUSv3 のみ (この関数は POSIX.1-2008 で削除されている)]
414 gethostent()
415 gethostid()
416 gethostname()
417 getline() [POSIX.1-2008 で追加された]
418 getlogin()
419 getlogin_r()
420 getnameinfo()
421 getnetbyaddr()
422 getnetbyname()
423 getnetent()
424 getopt() (opterr が 0 以外の場合)
425 getprotobyname()
426 getprotobynumber()
427 getprotoent()
428 getpwent()
429 getpwnam()
430 getpwnam_r()
431 getpwuid()
432 getpwuid_r()
433 gets()
434 getservbyname()
435 getservbyport()
436 getservent()
437 getutxent()
438 getutxid()
439 getutxline()
440 getwc()
441 getwchar()
442 getwd() [SUSv3 のみ (この関数は POSIX.1-2008 で削除されている)]
443 glob()
444 iconv_close()
445 iconv_open()
446 ioctl()
447 link()
448 linkat() [POSIX.1-2008 で追加された]
449 lio_listio() [POSIX.1-2008 で追加された]
450 localtime()
451 localtime_r()
452 lockf() [POSIX.1-2008 で追加された]
453 lseek()
454 lstat()
455 mkdir() [POSIX.1-2008 で追加された]
456 mkdirat() [POSIX.1-2008 で追加された]
457 mkdtemp() [POSIX.1-2008 で追加された]
458 mkfifo() [POSIX.1-2008 で追加された]
459 mkfifoat() [POSIX.1-2008 で追加された]
460 mknod() [POSIX.1-2008 で追加された]
461 mknodat() [POSIX.1-2008 で追加された]
462 mkstemp()
463 mktime()
464 nftw()
465 opendir()
466 openlog()
467 pathconf()
468 pclose()
469 perror()
470 popen()
471 posix_fadvise()
472 posix_fallocate()
473 posix_madvise()
474 posix_openpt()
475 posix_spawn()
476 posix_spawnp()
477 posix_trace_clear()
478 posix_trace_close()
479 posix_trace_create()
480 posix_trace_create_withlog()
481 posix_trace_eventtypelist_getnext_id()
482 posix_trace_eventtypelist_rewind()
483 posix_trace_flush()
484 posix_trace_get_attr()
485 posix_trace_get_filter()
486 posix_trace_get_status()
487 posix_trace_getnext_event()
488 posix_trace_open()
489 posix_trace_rewind()
490 posix_trace_set_filter()
491 posix_trace_shutdown()
492 posix_trace_timedgetnext_event()
493 posix_typed_mem_open()
494 printf()
495 psiginfo() [POSIX.1-2008 で追加された]
496 psignal() [POSIX.1-2008 で追加された]
497 pthread_rwlock_rdlock()
498 pthread_rwlock_timedrdlock()
499 pthread_rwlock_timedwrlock()
500 pthread_rwlock_wrlock()
501 putc()
502 putc_unlocked()
503 putchar()
504 putchar_unlocked()
505 puts()
506 pututxline()
507 putwc()
508 putwchar()
509 readdir()
510 readdir_r()
511 readlink() [POSIX.1-2008 で追加された]
512 readlinkat() [POSIX.1-2008 で追加された]
513 remove()
514 rename()
515 renameat() [POSIX.1-2008 で追加された]
516 rewind()
517 rewinddir()
518 scandir() [POSIX.1-2008 で追加された]
519 scanf()
520 seekdir()
521 semop()
522 setgrent()
523 sethostent()
524 setnetent()
525 setprotoent()
526 setpwent()
527 setservent()
528 setutxent()
529 sigpause() [POSIX.1-2008 で追加された]
530 stat()
531 strerror()
532 strerror_r()
533 strftime()
534 symlink()
535 symlinkat() [POSIX.1-2008 で追加された]
536 sync()
537 syslog()
538 tmpfile()
539 tmpnam()
540 ttyname()
541 ttyname_r()
542 tzset()
543 ungetc()
544 ungetwc()
545 unlink()
546 unlinkat() [POSIX.1-2008 で追加された]
547 utime() [POSIX.1-2008 で追加された]
548 utimensat() [POSIX.1-2008 で追加された]
549 utimes() [POSIX.1-2008 で追加された]
550 vdprintf() [POSIX.1-2008 で追加された]
551 vfprintf()
552 vfwprintf()
553 vprintf()
554 vwprintf()
555 wcsftime()
556 wordexp()
557 wprintf()
558 wscanf()
559 .fi
560 .in
561
562 実装時に、標準規格で規定されていないその他の関数を取り消しポイント
563 とすることも認められている。
564 特に、停止 (block) する可能性がある非標準の関数を取り消しポイントと
565 する実装はあり得ることだろう
566 (ファイルを扱う可能性のあるほとんどの関数がこれに含まれる)。
567 .\" So, scanning "cancellation point" comments in the glibc 2.8 header
568 .\" files, it looks as though at least the following nonstandard
569 .\" functions are cancellation points:
570 .\" endnetgrent
571 .\" endspent
572 .\" epoll_pwait
573 .\" epoll_wait
574 .\" fcloseall
575 .\" fdopendir
576 .\" fflush_unlocked
577 .\" fgetc_unlocked
578 .\" fgetgrent
579 .\" fgetgrent_r
580 .\" fgetpwent
581 .\" fgetpwent_r
582 .\" fgets_unlocked
583 .\" fgetspent
584 .\" fgetspent_r
585 .\" fgetwc_unlocked
586 .\" fgetws_unlocked
587 .\" fputc_unlocked
588 .\" fputs_unlocked
589 .\" fputwc_unlocked
590 .\" fputws_unlocked
591 .\" fread_unlocked
592 .\" fwrite_unlocked
593 .\" gai_suspend
594 .\" getaddrinfo_a
595 .\" getdate_r
596 .\" getgrent_r
597 .\" getgrouplist
598 .\" gethostbyaddr_r
599 .\" gethostbyname2
600 .\" gethostbyname2_r
601 .\" gethostbyname_r
602 .\" gethostent_r
603 .\" getnetbyaddr_r
604 .\" getnetbyname_r
605 .\" getnetent_r
606 .\" getnetgrent
607 .\" getnetgrent_r
608 .\" getprotobyname_r
609 .\" getprotobynumber_r
610 .\" getprotoent_r
611 .\" getpw
612 .\" getpwent_r
613 .\" getservbyname_r
614 .\" getservbyport_r
615 .\" getservent_r
616 .\" getspent
617 .\" getspent_r
618 .\" getspnam
619 .\" getspnam_r
620 .\" getutmp
621 .\" getutmpx
622 .\" getw
623 .\" getwc_unlocked
624 .\" getwchar_unlocked
625 .\" initgroups
626 .\" innetgr
627 .\" mkostemp
628 .\" mkostemp64
629 .\" mkstemp64
630 .\" ppoll
631 .\" pthread_timedjoin_np
632 .\" putgrent
633 .\" putpwent
634 .\" putspent
635 .\" putw
636 .\" putwc_unlocked
637 .\" putwchar_unlocked
638 .\" rcmd
639 .\" rcmd_af
640 .\" rexec
641 .\" rexec_af
642 .\" rresvport
643 .\" rresvport_af
644 .\" ruserok
645 .\" ruserok_af
646 .\" setnetgrent
647 .\" setspent
648 .\" sgetspent
649 .\" sgetspent_r
650 .\" updwtmpx
651 .\" utmpxname
652 .\" vfscanf
653 .\" vfwscanf
654 .\" vscanf
655 .\" vsyslog
656 .\" vwscanf
657 .SS "Linux でのコンパイル"
658 Linux では、Pthreads API を用いたプログラムは
659 .I "cc \-pthread"
660 でコンパイルすべきである。
661 .SS "POSIX スレッドの Linux での実装"
662 これまで、2つのスレッドの実装が Linux の GNU C ライブラリにより
663 提供されてきた。
664 .TP
665 .B LinuxThreads
666 最初の Pthreads の実装。
667 glibc 2.4 以降は、この実装はもはやサポートされていない。
668 .TP
669 .BR NPTL " (Native POSIX Threads Library)"
670 新しい Pthreads の実装。LinuxThreads と比べると、
671 NPTL は POSIX.1 の要求仕様への準拠の度合いが高く、
672 多数のスレッドを作成した際の性能も高い。
673 NPTL は glibc 2.3.2 以降で利用可能である。
674 NPTL を利用するには Linux 2.6 カーネルに実装されている機能が必要である。
675 .PP
676 どちらの実装もいわゆる 1:1 実装、すなわち個々のスレッドが
677 カーネルのスケジューリング実体にマッピングされる。
678 どちらのスレッドの実装も Linux の
679 .BR clone (2)
680 システムコールを利用している。
681 NPTL では、スレッド同期の基本機構 (mutex や スレッドの join 等) は
682 Linux の
683 .BR futex (2)
684 システムコールを使って実装されている。
685 .SS LinuxThreads
686 この実装の大きな特徴は以下の通りである:
687 .IP \- 3
688 メインスレッド (最初のスレッド) とプログラムが
689 .BR pthread_create (3)
690 を使って作成したスレッドに加え、
691 この実装では「管理 (manager)」スレッドが作成される。
692 管理スレッドはスレッドの作成と終了を取り扱う
693 (このスレッドがうっかり kill されると、問題が起こることがある)。
694 .IP \- 3
695 この実装では内部でシグナルを使用している。
696 Linux 2.2 以降では、リアルタイムシグナルのうち最初の 3つが使われる
697 .RB ( signal (7)
698 参照)。
699 それ以前のカーネルでは
700 .B SIGUSR1
701
702 .B SIGUSR2
703 が使われる。
704 アプリケーションは、スレッド実装で利用されているシグナルを
705 どれも使わないようにしなければならない。
706 .IP \- 3
707 スレッド間でプロセス ID を共有しない
708 (実際には LinuxThreads のスレッドは通常よりは情報を共有するプロセスとして
709 実装されているが、一つの共通のプロセス ID を共有してはいない)。
710 (管理スレッドを含む) LinuxThreads スレッドは
711 .BR ps (1)
712 を使うと別のプロセスのように見える。
713 .PP
714 LinuxThreads の実装では POSIX.1 仕様から逸脱している点が
715 いくつかある。以下に示すような点がある:
716 .IP \- 3
717 .BR getpid (2)
718 を呼び出したときに、スレッド毎に異なる値が返される。
719 .IP \- 3
720 メインスレッド以外のスレッドで
721 .BR getppid (2)
722 を呼び出すと、管理スレッドのプロセス ID が返される。
723 本当は、これらのスレッドで
724 .BR getppid (2)
725 を呼んだ場合にはメインスレッドでの
726 .BR getppid (2)
727 と同じ値が返るべきである。
728 .IP \- 3
729 あるスレッドが
730 .BR fork (2)
731 を使って新しい子プロセスを作成した場合、
732 どのスレッドでもこの子プロセスを
733 .BR wait (2)
734 できるべきである。しかしながら、この実装では子プロセスを作成した
735 スレッドだけがこの子プロセスを
736 .BR wait (2)
737 できる。
738 .IP \- 3
739 あるスレッドが
740 .BR execve (2)
741 を呼び出した場合、他のスレッドは全て終了される (POSIX.1 の仕様通り)。
742 しかしながら、新しいプロセスは
743 .BR execve (2)
744 を呼んだスレッドと同じ PID を持つ。正しくは
745 メインスレッドと同じ PID を持つべきである。
746 .IP \- 3
747 スレッド間でユーザ ID とグループ ID が共有されない
748 このことは、set-user-ID プログラムで面倒な事態を招いたり、
749 アプリケーションが
750 .BR seteuid (2)
751 などを使って信用情報 (credentials) を変更した場合に
752 Pthreads 関数が失敗する原因となる。
753 .IP \- 3
754 スレッド間で共通のセッション ID やプロセスグループ ID を共有しない。
755 .IP \- 3
756 スレッド間で
757 .BR fcntl (2)
758 を使って作成されるレコード・ロックを共有しない。
759 .IP \- 3
760 .BR times (2)
761
762 .BR getrusage (2)
763 が返す情報がプロセス全体の情報でなくスレッド単位の情報である。
764 .IP \- 3
765 スレッド間でセマフォのアンドゥ値
766 .RB ( semop (2)
767 参照) を共有しない。
768 .IP \- 3
769 スレッド間でインターバル・タイマを共有しない。
770 .IP \- 3
771 スレッドは共通の nice 値を共有しない。
772 .IP \- 3
773 POSXI.1 では、全体としてのプロセスに送られるシグナルと、
774 個別のスレッドに送られるシグナルを区別して考えている。
775 POSIX.1 によると、プロセスに送られたシグナル (例えば
776 .BR kill (2)
777 を使って送る) は、そのプロセスに属すスレッドのうち
778 勝手に (arbitrarily) に選択された一つのスレッドにより処理される
779 ことになっている。LinuxThreads はプロセスに送られるシグナルの
780 概念に対応しておらず、シグナルは特定のスレッドにだけ送ることができる。
781 .IP \- 3
782 スレッドはそれぞれの独自の代替シグナルスタックの設定を持つ。
783 しかし、新しいスレッドの代替シグナルスタックの設定は
784 そのスレッドを作成したスレッドからコピーされ、そのため
785 スレッドは最初は一つの代替シグナルスタックを共有する。
786 (仕様では、新しいスレッドは代替シグナルスタックが定義されていない状態
787 で開始されるべきとされている。
788 2つのスレッドが共有されている代替シグナルスタック上で同時に
789 シグナルの処理を行った場合、予測不可能なプログラムのエラーが
790 起こり得る。)
791 .SS NPTL
792 NPTL では、一つのプロセスの全てのスレッドは同じスレッド・グループ
793 に属する; スレッド・グループの全メンバーは同じ PID を共有する。
794 NPTL は管理スレッド (manager thread) を利用しない。
795 NPTL は内部でリアルタイムシグナルのうち最初の 2つの番号を使用しており
796 .RB ( signal (7)
797 参照)、これらのシグナルはアプリケーションでは使用できない。
798
799 NPTL にも POSIX.1 に準拠していない点が少なくとも一つある:
800 .IP \- 3
801 スレッドは共通の nice 値を共有しない。
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.
807 .PP
808 NPTL の標準非準拠な点のうちいくつかは以前のカーネルでのみ発生する:
809 .IP \- 3
810 .BR times (2)
811
812 .BR getrusage (2)
813 が返す情報がプロセス全体の情報でなくスレッド単位の情報である
814 (カーネル 2.6.9 で修正された)。
815 .IP \- 3
816 スレッド間でリソース制限を共有しない (カーネル 2.6.10 で修正された)。
817 .IP \- 3
818 スレッド間でインターバル・タイマを共有しない
819 (カーネル 2.6.12 で修正された)。
820 .IP \- 3
821 メインスレッドだけが
822 .BR setsid (2)
823 を使って新しいセッションを開始することができる
824 (カーネル 2.6.16 で修正された)。
825 .IP \- 3
826 メインスレッドだけが
827 .BR setpgid (2)
828 を使ってそのプロセスをプロセス・グループ・リーダーにすることができる
829 (カーネル 2.6.16 で修正された)。
830 .IP \- 3
831 スレッドはそれぞれの独自の代替シグナルスタックの設定を持つ。
832 しかし、新しいスレッドの代替シグナルスタックの設定は
833 そのスレッドを作成したスレッドからコピーされ、そのため
834 スレッドは最初は一つの代替シグナルスタックを共有する
835 (カーネル 2.6.16 で修正された)。
836 .PP
837 NPTL の実装では以下の点についても注意すること:
838 .IP \- 3
839 スタックサイズのリソースのソフト・リミット
840 .RB ( setrlimit (2)
841
842 .B RLIMIT_STACK
843 の説明を参照) が
844 .I unlimited
845 以外の値に設定されている場合、ソフト・リミットの値が
846 新しいスレッドのデフォルトのスタックサイズとなる。
847 設定を有効にするためには、プログラムを実行する前にリミット値を
848 設定しておかなければならない。たいていは、シェルの組み込みコマンドの
849 .I ulimit -s
850 (C シェルでは
851 .IR "limit stacksize" )
852 を使って設定する。
853 .SS "スレッド実装の判定"
854 glibc 2.3.2 以降では、
855 .BR getconf (1)
856 コマンドを使って、
857 システムのスレッド実装を判定することができる。
858 以下に例を示す:
859 .nf
860 .in +4n
861
862 bash$ getconf GNU_LIBPTHREAD_VERSION
863 NPTL 2.3.4
864 .in
865 .fi
866 .PP
867 ぞれ以前の glibc のバージョンでは、以下のようなコマンドで
868 デフォルトのスレッド実装を判定することができる。
869 .nf
870 .in +4n
871
872 bash$ $( ldd /bin/ls | grep libc.so | awk \(aq{print $3}\(aq ) | \\
873                 egrep \-i \(aqthreads|ntpl\(aq
874         Native POSIX Threads Library by Ulrich Drepper et al
875 .in
876 .fi
877 .SS "スレッドの実装の選択: LD_ASSUME_KERNEL"
878 LinuxThreads と NPTL の両方をサポートしている glibc
879 (glibc 2.3.\fIx\fP) があるシステムでは、
880 .B LD_ASSUME_KERNEL
881 環境変数を使うことで、動的リンカがデフォルトで
882 選択するスレッド実装を上書きすることができる。
883 この変数により、動的リンカが特定のバージョンのカーネル上で
884 動作していると仮定するように指定する。
885 NPTL が必要とするサポート機能を提供していないカーネルバージョンを
886 指定することで、強制的に LinuxThreads を使うことができる
887 (このようなことをする最もありそうな場面は、
888 LinuxThreads の標準非準拠な振舞いに依存する (壊れた) アプリケーション
889 を動作させる場合だろう)。
890 以下に例を示す:
891 .nf
892 .in +4n
893
894 bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so | \\
895                 awk \(aq{print $3}\(aq ) | egrep \-i \(aqthreads|ntpl\(aq
896         linuxthreads-0.10 by Xavier Leroy
897 .in
898 .fi
899 .SH 関連項目
900 .BR clone (2),
901 .BR futex (2),
902 .BR gettid (2),
903 .BR futex (7),
904 .BR sigevent (7),
905 .BR signal (7),
906 .br
907 および Pthreads の各種マニュアルページ、例えば:
908 .BR pthread_attr_init (3),
909 .BR pthread_atfork (3),
910 .BR pthread_cancel (3),
911 .BR pthread_cleanup_push (3),
912 .BR pthread_cond_signal (3),
913 .BR pthread_cond_wait (3),
914 .BR pthread_create (3),
915 .BR pthread_detach (3),
916 .BR pthread_equal (3),
917 .BR pthread_exit (3),
918 .BR pthread_key_create (3),
919 .BR pthread_kill (3),
920 .BR pthread_mutex_lock (3),
921 .BR pthread_mutex_unlock (3),
922 .BR pthread_once (3),
923 .BR pthread_setcancelstate (3),
924 .BR pthread_setcanceltype (3),
925 .BR pthread_setspecific (3),
926 .BR pthread_sigmask (3),
927 .BR pthread_testcancel (3)