OSDN Git Service

(split) LDP: draft snapshot generated from latest ja.po files.
[linuxjm/LDP_man-pages.git] / draft / 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 .\"*******************************************************************
25 .\"
26 .\" This file was generated with po4a. Translate the source file.
27 .\"
28 .\"*******************************************************************
29 .TH PTHREADS 7 2010\-11\-14 Linux "Linux Programmer's Manual"
30 .SH 名前
31 pthreads \- POSIX スレッド
32 .SH 説明
33 POSIX.1 は、一般に POSIX スレッドや Pthreads として知られる スレッド・プログラミングのインタフェース群
34 (関数、ヘッダファイル)  を規定している。一つのプロセスは複数のスレッドを持つことができ、 全てのスレッドは同じプログラムを実行する。
35 これらのスレッドは同じ大域メモリ (データとヒープ領域) を共有するが、 各スレッドは自分専用のスタック (自動変数) を持つ。
36
37 POSIX.1 はスレッド間でどのような属性を共有するかについても定めている (つまり、これらの属性はスレッド単位ではなくプロセス全体で共通である):
38 .IP \- 3
39 プロセス ID
40 .IP \- 3
41 親プロセス ID
42 .IP \- 3
43 プロセスグループ ID とセッション ID
44 .IP \- 3
45 制御端末
46 .IP \- 3
47 ユーザ ID とグループ ID
48 .IP \- 3
49 オープンするファイルディスクリプタ
50 .IP \- 3
51 レコードのロック (\fBfcntl\fP(3)  参照)
52 .IP \- 3
53 シグナルの配置
54 .IP \- 3
55 ファイルモード作成マスク (\fBumask\fP(2))
56 .IP \- 3
57 カレント・ディレクトリ (\fBchdir\fP(2))  とルート・ディレクトリ (\fBchroot\fP(2))
58 .IP \- 3
59 インターバル・タイマ (\fBsetitimer\fP(2))  と POSIX タイマ (\fBtimer_create\fP(2))
60 .IP \- 3
61 nice 値 (\fBsetpriority\fP(2))
62 .IP \- 3
63 リソース制限 (\fBsetrlimit\fP(2))
64 .IP \- 3
65 CPU 時間 (\fBtimes\fP(2))  とリソース (\fBgetrusage\fP(2))  の消費状況の計測
66 .PP
67 スタックについても、POSIX.1 はどのような属性が 個々のスレッドで独立に管理されるかを規定している:
68 .IP \- 3
69 スレッド ID (\fBpthread_t\fP データ型)
70 .IP \- 3
71 シグナルマスク (\fBpthread_sigmask\fP(3))
72 .IP \- 3
73 \fIerrno\fP 変数
74 .IP \- 3
75 代替シグナルスタック (\fBsigaltstack\fP(2))
76 .IP \- 3
77 リアルタイム・スケジューリングのポリシーと優先度 (\fBsched_setscheduler\fP(2)  と \fBsched_setparam\fP(2))
78 .PP
79 以下の Linux 特有の機能もスレッド単位である:
80 .IP \- 3
81 ケーパビリティ (\fBcapabilities\fP(7)  参照)
82 .IP \- 3
83 CPU affinity (親和度)  (\fBsched_setaffinity\fP(2))
84 .SS "pthreads 関数の返り値"
85 ほとんどの pthreads 関数は成功すると 0 を返し、 失敗した場合エラー番号を返す。 pthreads 関数は \fIerrno\fP
86 をセットしない点に注意すること。 POSIX.1\-2001 では、 エラーを返す可能性のある pthreads 関数がエラー \fBEINTR\fP
87 で失敗することは決してないと規定している。
88 .SS "スレッド ID"
89 あるプロセス内の各スレッドは (\fIpthread_t\fP 型の) 一意なスレッド識別子を持つ。 この識別子は、 \fBpthread_create\fP(3)
90 の呼び出し元に返される。また、スレッドは自身のスレッド識別子を \fBpthread_self\fP(3)  を使って取得できる。 スレッド ID
91 の一意性が保証されるのは、一つのプロセス内においてのみである。 終了したスレッドが join された後では、スレッド ID は再利用される可能性がある。
92 スレッド ID を引き数に取る全てのスレッド関数において、 その ID は呼び出し元と同じプロセス内の一つのスレッドを参照する。
93 .SS スレッドセーフな関数
94 スレッドセーフな関数は、複数のスレッドから同時に呼び出しても安全な (すなわち、同時に呼び出されたかに関わらず、同じ結果を返す) 関数のことである。
95
96 POSIX.1\-2001 と POSIX.1\-2008では、一部の例外を除き、 標準で規定されている全ての関数がスレッドセーフであることを要求している。
97 以下の関数が例外である。
98 .in +4n
99 .nf
100
101 asctime()
102 basename()
103 catgets()
104 crypt()
105 ctermid() (NULL でない引き数を渡された場合)
106 ctime()
107 dbm_clearerr()
108 dbm_close()
109 dbm_delete()
110 dbm_error()
111 dbm_fetch()
112 dbm_firstkey()
113 dbm_nextkey()
114 dbm_open()
115 dbm_store()
116 dirname()
117 dlerror()
118 drand48()
119 ecvt() [POSIX.1\-2001 のみ (POSIX.1\-2008 で削除された)]
120 encrypt()
121 endgrent()
122 endpwent()
123 endutxent()
124 fcvt() [POSIX.1\-2001 のみ (POSIX.1\-2008 で削除された)]
125 ftw()
126 gcvt() [POSIX.1\-2001 のみ (POSIX.1\-2008 で削除された)]
127 getc_unlocked()
128 getchar_unlocked()
129 getdate()
130 getenv()
131 getgrent()
132 getgrgid()
133 getgrnam()
134 gethostbyaddr() [POSIX.1\-2001 のみ (POSIX.1\-2008 で削除された)]
135 gethostbyname() [POSIX.1\-2001 のみ (POSIX.1\-2008 で削除された)]
136 gethostent()
137 getlogin()
138 getnetbyaddr()
139 getnetbyname()
140 getnetent()
141 getopt()
142 getprotobyname()
143 getprotobynumber()
144 getprotoent()
145 getpwent()
146 getpwnam()
147 getpwuid()
148 getservbyname()
149 getservbyport()
150 getservent()
151 getutxent()
152 getutxid()
153 getutxline()
154 gmtime()
155 hcreate()
156 hdestroy()
157 hsearch()
158 inet_ntoa()
159 l64a()
160 lgamma()
161 lgammaf()
162 lgammal()
163 localeconv()
164 localtime()
165 lrand48()
166 mrand48()
167 nftw()
168 nl_langinfo()
169 ptsname()
170 putc_unlocked()
171 putchar_unlocked()
172 putenv()
173 pututxline()
174 rand()
175 readdir()
176 setenv()
177 setgrent()
178 setkey()
179 setpwent()
180 setutxent()
181 strerror()
182 strsignal() [POSIX.1\-2008 で追加された]
183 strtok()
184 system() [POSIX.1\-2008 で追加された]
185 tmpnam() (NULL でない引き数を渡された場合)
186 ttyname()
187 unsetenv()
188 wcrtomb() (最後の引き数が NULL の場合)
189 wcsrtombs() (最後の引き数が NULL の場合)
190 wcstombs()
191 wctomb()
192 .fi
193 .in
194 .SS "async\-cancel\-safe 関数"
195 async\-cancel\-safe 関数は、
196 非同期キャンセル機能が有効になっているアプリケーションで
197 安全に呼び出すことができる関数のことである
198 (\fBpthread_setcancelstate\fP(3) を参照)。
199
200 以下の関数だけが、POSIX.1\-2001 と POSIX.1\-2008 で async\-cancel\-safe で
201 なければならないとされている。
202 .in +4n
203 .nf
204
205 pthread_cancel()
206 pthread_setcancelstate()
207 pthread_setcanceltype()
208 .fi
209 .in
210 .SS "取り消しポイント (cancellation points)"
211 POSIX.1 の規定では、特定の関数は取り消しポイントでなければならず、 他の特定の関数は取り消しポイントであってもよいとされている。
212 あるスレッドが取り消し可能で、その取り消し種別 (cancelability type)  が延期 (deferred)
213 で、そのスレッドに対する取り消し要求が処理待ちの場合、 取り消しポイントである関数を呼び出した時点で、そのスレッドのキャンセルが 行われる。
214
215 POSIX.1\-2001 と POSIX.1\-2008 の両方、もしくはいずれか一方では、 以下の関数は、取り消しポイント (cancellation
216 points) で あることが必須となっている。
217
218 .\" FIXME
219 .\" Document the list of all functions that are cancellation points in glibc
220 .in +4n
221 .nf
222 accept()
223 aio_suspend()
224 clock_nanosleep()
225 close()
226 connect()
227 creat()
228 fcntl() F_SETLKW
229 fdatasync()
230 fsync()
231 getmsg()
232 getpmsg()
233 lockf() F_LOCK
234 mq_receive()
235 mq_send()
236 mq_timedreceive()
237 mq_timedsend()
238 msgrcv()
239 msgsnd()
240 msync()
241 nanosleep()
242 open()
243 openat() [POSIX.1\-2008 で追加された]
244 pause()
245 poll()
246 pread()
247 pselect()
248 pthread_cond_timedwait()
249 pthread_cond_wait()
250 pthread_join()
251 pthread_testcancel()
252 putmsg()
253 putpmsg()
254 pwrite()
255 read()
256 readv()
257 recv()
258 recvfrom()
259 recvmsg()
260 select()
261 sem_timedwait()
262 sem_wait()
263 send()
264 sendmsg()
265 sendto()
266 sigpause() [POSIX.1\-2001 only (moves to "may" list in POSIX.1\-2008)]
267 sigsuspend()
268 sigtimedwait()
269 sigwait()
270 sigwaitinfo()
271 sleep()
272 system()
273 tcdrain()
274 usleep() [POSIX.1\-2001 のみ (POSIX.1\-2008 で削除された)]
275 wait()
276 waitid()
277 waitpid()
278 write()
279 writev()
280 .fi
281 .in
282
283 POSIX.1\-2001 と POSIX.1\-2008 の両方、もしくはいずれか一方では、 以下の関数は、取り消しポイント (cancellation
284 points) で あってもよいことになっている。
285
286 .in +4n
287 .nf
288 access()
289 asctime()
290 asctime_r()
291 catclose()
292 catgets()
293 catopen()
294 chmod() [POSIX.1\-2008 で追加された]
295 chown() [POSIX.1\-2008 で追加された]
296 closedir()
297 closelog()
298 ctermid()
299 ctime()
300 ctime_r()
301 dbm_close()
302 dbm_delete()
303 dbm_fetch()
304 dbm_nextkey()
305 dbm_open()
306 dbm_store()
307 dlclose()
308 dlopen()
309 dprintf() [POSIX.1\-2008 で追加された]
310 endgrent()
311 endhostent()
312 endnetent()
313 endprotoent()
314 endpwent()
315 endservent()
316 endutxent()
317 faccessat() [POSIX.1\-2008 で追加された]
318 fchmod() [POSIX.1\-2008 で追加された]
319 fchmodat() [POSIX.1\-2008 で追加された]
320 fchown() [POSIX.1\-2008 で追加された]
321 fchownat() [POSIX.1\-2008 で追加された]
322 fclose()
323 fcntl() (cmd 引き数が何であっても)
324 fflush()
325 fgetc()
326 fgetpos()
327 fgets()
328 fgetwc()
329 fgetws()
330 fmtmsg()
331 fopen()
332 fpathconf()
333 fprintf()
334 fputc()
335 fputs()
336 fputwc()
337 fputws()
338 fread()
339 freopen()
340 fscanf()
341 fseek()
342 fseeko()
343 fsetpos()
344 fstat()
345 fstatat() [POSIX.1\-2008 で追加された]
346 ftell()
347 ftello()
348 ftw()
349 futimens() [POSIX.1\-2008 で追加された]
350 fwprintf()
351 fwrite()
352 fwscanf()
353 getaddrinfo()
354 getc()
355 getc_unlocked()
356 getchar()
357 getchar_unlocked()
358 getcwd()
359 getdate()
360 getdelim() [POSIX.1\-2008 で追加された]
361 getgrent()
362 getgrgid()
363 getgrgid_r()
364 getgrnam()
365 getgrnam_r()
366 gethostbyaddr() [SUSv3 のみ (この関数は POSIX.1\-2008 で削除されている)]
367 gethostbyname() [SUSv3 のみ (この関数は POSIX.1\-2008 で削除されている)]
368 gethostent()
369 gethostid()
370 gethostname()
371 getline() [POSIX.1\-2008 で追加された]
372 getlogin()
373 getlogin_r()
374 getnameinfo()
375 getnetbyaddr()
376 getnetbyname()
377 getnetent()
378 getopt() (opterr が 0 以外の場合)
379 getprotobyname()
380 getprotobynumber()
381 getprotoent()
382 getpwent()
383 getpwnam()
384 getpwnam_r()
385 getpwuid()
386 getpwuid_r()
387 gets()
388 getservbyname()
389 getservbyport()
390 getservent()
391 getutxent()
392 getutxid()
393 getutxline()
394 getwc()
395 getwchar()
396 getwd() [SUSv3 のみ (この関数は POSIX.1\-2008 で削除されている)]
397 glob()
398 iconv_close()
399 iconv_open()
400 ioctl()
401 link()
402 linkat() [POSIX.1\-2008 で追加された]
403 lio_listio() [POSIX.1\-2008 で追加された]
404 localtime()
405 localtime_r()
406 lockf() [POSIX.1\-2008 で追加された]
407 lseek()
408 lstat()
409 mkdir() [POSIX.1\-2008 で追加された]
410 mkdirat() [POSIX.1\-2008 で追加された]
411 mkdtemp() [POSIX.1\-2008 で追加された]
412 mkfifo() [POSIX.1\-2008 で追加された]
413 mkfifoat() [POSIX.1\-2008 で追加された]
414 mknod() [POSIX.1\-2008 で追加された]
415 mknodat() [POSIX.1\-2008 で追加された]
416 mkstemp()
417 mktime()
418 nftw()
419 opendir()
420 openlog()
421 pathconf()
422 pclose()
423 perror()
424 popen()
425 posix_fadvise()
426 posix_fallocate()
427 posix_madvise()
428 posix_openpt()
429 posix_spawn()
430 posix_spawnp()
431 posix_trace_clear()
432 posix_trace_close()
433 posix_trace_create()
434 posix_trace_create_withlog()
435 posix_trace_eventtypelist_getnext_id()
436 posix_trace_eventtypelist_rewind()
437 posix_trace_flush()
438 posix_trace_get_attr()
439 posix_trace_get_filter()
440 posix_trace_get_status()
441 posix_trace_getnext_event()
442 posix_trace_open()
443 posix_trace_rewind()
444 posix_trace_set_filter()
445 posix_trace_shutdown()
446 posix_trace_timedgetnext_event()
447 posix_typed_mem_open()
448 printf()
449 psiginfo() [POSIX.1\-2008 で追加された]
450 psignal() [POSIX.1\-2008 で追加された]
451 pthread_rwlock_rdlock()
452 pthread_rwlock_timedrdlock()
453 pthread_rwlock_timedwrlock()
454 pthread_rwlock_wrlock()
455 putc()
456 putc_unlocked()
457 putchar()
458 putchar_unlocked()
459 puts()
460 pututxline()
461 putwc()
462 putwchar()
463 readdir()
464 readdir_r()
465 readlink() [POSIX.1\-2008 で追加された]
466 readlinkat() [POSIX.1\-2008 で追加された]
467 remove()
468 rename()
469 renameat() [POSIX.1\-2008 で追加された]
470 rewind()
471 rewinddir()
472 scandir() [POSIX.1\-2008 で追加された]
473 scanf()
474 seekdir()
475 semop()
476 setgrent()
477 sethostent()
478 setnetent()
479 setprotoent()
480 setpwent()
481 setservent()
482 setutxent()
483 sigpause() [POSIX.1\-2008 で追加された]
484 stat()
485 strerror()
486 strerror_r()
487 strftime()
488 symlink()
489 symlinkat() [POSIX.1\-2008 で追加された]
490 sync()
491 syslog()
492 tmpfile()
493 tmpnam()
494 ttyname()
495 ttyname_r()
496 tzset()
497 ungetc()
498 ungetwc()
499 unlink()
500 unlinkat() [POSIX.1\-2008 で追加された]
501 utime() [POSIX.1\-2008 で追加された]
502 utimensat() [POSIX.1\-2008 で追加された]
503 utimes() [POSIX.1\-2008 で追加された]
504 vdprintf() [POSIX.1\-2008 で追加された]
505 vfprintf()
506 vfwprintf()
507 vprintf()
508 vwprintf()
509 wcsftime()
510 wordexp()
511 wprintf()
512 wscanf()
513 .fi
514 .in
515
516 .\" So, scanning "cancellation point" comments in the glibc 2.8 header
517 .\" files, it looks as though at least the following nonstandard
518 .\" functions are cancellation points:
519 .\" endnetgrent
520 .\" endspent
521 .\" epoll_pwait
522 .\" epoll_wait
523 .\" fcloseall
524 .\" fdopendir
525 .\" fflush_unlocked
526 .\" fgetc_unlocked
527 .\" fgetgrent
528 .\" fgetgrent_r
529 .\" fgetpwent
530 .\" fgetpwent_r
531 .\" fgets_unlocked
532 .\" fgetspent
533 .\" fgetspent_r
534 .\" fgetwc_unlocked
535 .\" fgetws_unlocked
536 .\" fputc_unlocked
537 .\" fputs_unlocked
538 .\" fputwc_unlocked
539 .\" fputws_unlocked
540 .\" fread_unlocked
541 .\" fwrite_unlocked
542 .\" gai_suspend
543 .\" getaddrinfo_a
544 .\" getdate_r
545 .\" getgrent_r
546 .\" getgrouplist
547 .\" gethostbyaddr_r
548 .\" gethostbyname2
549 .\" gethostbyname2_r
550 .\" gethostbyname_r
551 .\" gethostent_r
552 .\" getnetbyaddr_r
553 .\" getnetbyname_r
554 .\" getnetent_r
555 .\" getnetgrent
556 .\" getnetgrent_r
557 .\" getprotobyname_r
558 .\" getprotobynumber_r
559 .\" getprotoent_r
560 .\" getpw
561 .\" getpwent_r
562 .\" getservbyname_r
563 .\" getservbyport_r
564 .\" getservent_r
565 .\" getspent
566 .\" getspent_r
567 .\" getspnam
568 .\" getspnam_r
569 .\" getutmp
570 .\" getutmpx
571 .\" getw
572 .\" getwc_unlocked
573 .\" getwchar_unlocked
574 .\" initgroups
575 .\" innetgr
576 .\" mkostemp
577 .\" mkostemp64
578 .\" mkstemp64
579 .\" ppoll
580 .\" pthread_timedjoin_np
581 .\" putgrent
582 .\" putpwent
583 .\" putspent
584 .\" putw
585 .\" putwc_unlocked
586 .\" putwchar_unlocked
587 .\" rcmd
588 .\" rcmd_af
589 .\" rexec
590 .\" rexec_af
591 .\" rresvport
592 .\" rresvport_af
593 .\" ruserok
594 .\" ruserok_af
595 .\" setnetgrent
596 .\" setspent
597 .\" sgetspent
598 .\" sgetspent_r
599 .\" updwtmpx
600 .\" utmpxname
601 .\" vfscanf
602 .\" vfwscanf
603 .\" vscanf
604 .\" vsyslog
605 .\" vwscanf
606 実装時に、標準規格で規定されていないその他の関数を取り消しポイント とすることも認められている。 特に、停止 (block)
607 する可能性がある非標準の関数を取り消しポイントと する実装はあり得ることだろう (ファイルを扱う可能性のあるほとんどの関数がこれに含まれる)。
608 .SS "Linux でのコンパイル"
609 Linux では、Pthreads API を用いたプログラムは \fIcc \-pthread\fP でコンパイルすべきである。
610 .SS "POSIX スレッドの Linux での実装"
611 これまで、2つのスレッドの実装が Linux の GNU C ライブラリにより 提供されてきた。
612 .TP 
613 \fBLinuxThreads\fP
614 最初の Pthreads の実装。 glibc 2.4 以降は、この実装はもはやサポートされていない。
615 .TP 
616 \fBNPTL\fP (Native POSIX Threads Library)
617 新しい Pthreads の実装。LinuxThreads と比べると、 NPTL は POSIX.1 の要求仕様への準拠の度合いが高く、
618 多数のスレッドを作成した際の性能も高い。 NPTL は glibc 2.3.2 以降で利用可能である。 NPTL を利用するには Linux 2.6
619 カーネルに実装されている機能が必要である。
620 .PP
621 どちらの実装もいわゆる 1:1 実装、すなわち個々のスレッドが カーネルのスケジューリング実体にマッピングされる。 どちらのスレッドの実装も Linux
622 の \fBclone\fP(2)  システムコールを利用している。 NPTL では、スレッド同期の基本機構 (mutex や スレッドの join 等) は
623 Linux の \fBfutex\fP(2)  システムコールを使って実装されている。
624 .SS LinuxThreads
625 この実装の大きな特徴は以下の通りである:
626 .IP \- 3
627 メインスレッド (最初のスレッド) とプログラムが \fBpthread_create\fP(3)  を使って作成したスレッドに加え、 この実装では「管理
628 (manager)」スレッドが作成される。 管理スレッドはスレッドの作成と終了を取り扱う (このスレッドがうっかり kill
629 されると、問題が起こることがある)。
630 .IP \- 3
631 この実装では内部でシグナルを使用している。 Linux 2.2 以降では、リアルタイムシグナルのうち最初の 3つが使われる (\fBsignal\fP(7)
632 参照)。 それ以前のカーネルでは \fBSIGUSR1\fP と \fBSIGUSR2\fP が使われる。
633 アプリケーションは、スレッド実装で利用されているシグナルを どれも使わないようにしなければならない。
634 .IP \- 3
635 スレッド間でプロセス ID を共有しない (実際には LinuxThreads のスレッドは通常よりは情報を共有するプロセスとして
636 実装されているが、一つの共通のプロセス ID を共有してはいない)。 (管理スレッドを含む) LinuxThreads スレッドは \fBps\fP(1)
637 を使うと別のプロセスのように見える。
638 .PP
639 LinuxThreads の実装では POSIX.1 仕様から逸脱している点が いくつかある。以下に示すような点がある:
640 .IP \- 3
641 \fBgetpid\fP(2)  を呼び出したときに、スレッド毎に異なる値が返される。
642 .IP \- 3
643 メインスレッド以外のスレッドで \fBgetppid\fP(2)  を呼び出すと、管理スレッドのプロセス ID が返される。 本当は、これらのスレッドで
644 \fBgetppid\fP(2)  を呼んだ場合にはメインスレッドでの \fBgetppid\fP(2)  と同じ値が返るべきである。
645 .IP \- 3
646 あるスレッドが \fBfork\fP(2)  を使って新しい子プロセスを作成した場合、 どのスレッドでもこの子プロセスを \fBwait\fP(2)
647 できるべきである。しかしながら、この実装では子プロセスを作成した スレッドだけがこの子プロセスを \fBwait\fP(2)  できる。
648 .IP \- 3
649 あるスレッドが \fBexecve\fP(2)  を呼び出した場合、他のスレッドは全て終了される (POSIX.1 の仕様通り)。
650 しかしながら、新しいプロセスは \fBexecve\fP(2)  を呼んだスレッドと同じ PID を持つ。正しくは メインスレッドと同じ PID
651 を持つべきである。
652 .IP \- 3
653 スレッド間でユーザ ID とグループ ID が共有されない このことは、set\-user\-ID プログラムで面倒な事態を招いたり、 アプリケーションが
654 \fBseteuid\fP(2)  などを使って信用情報 (credentials) を変更した場合に Pthreads 関数が失敗する原因となる。
655 .IP \- 3
656 スレッド間で共通のセッション ID やプロセスグループ ID を共有しない。
657 .IP \- 3
658 スレッド間で \fBfcntl\fP(2)  を使って作成されるレコード・ロックを共有しない。
659 .IP \- 3
660 \fBtimes\fP(2)  と \fBgetrusage\fP(2)  が返す情報がプロセス全体の情報でなくスレッド単位の情報である。
661 .IP \- 3
662 スレッド間でセマフォのアンドゥ値 (\fBsemop\fP(2)  参照) を共有しない。
663 .IP \- 3
664 スレッド間でインターバル・タイマを共有しない。
665 .IP \- 3
666 スレッドは共通の nice 値を共有しない。
667 .IP \- 3
668 POSXI.1 では、全体としてのプロセスに送られるシグナルと、 個別のスレッドに送られるシグナルを区別して考えている。 POSIX.1
669 によると、プロセスに送られたシグナル (例えば \fBkill\fP(2)  を使って送る) は、そのプロセスに属すスレッドのうち 勝手に
670 (arbitrarily) に選択された一つのスレッドにより処理される ことになっている。LinuxThreads はプロセスに送られるシグナルの
671 概念に対応しておらず、シグナルは特定のスレッドにだけ送ることができる。
672 .IP \- 3
673 スレッドはそれぞれの独自の代替シグナルスタックの設定を持つ。 しかし、新しいスレッドの代替シグナルスタックの設定は
674 そのスレッドを作成したスレッドからコピーされ、そのため スレッドは最初は一つの代替シグナルスタックを共有する。
675 (仕様では、新しいスレッドは代替シグナルスタックが定義されていない状態 で開始されるべきとされている。
676 2つのスレッドが共有されている代替シグナルスタック上で同時に シグナルの処理を行った場合、予測不可能なプログラムのエラーが 起こり得る。)
677 .SS NPTL
678 NPTL では、一つのプロセスの全てのスレッドは同じスレッド・グループ に属する; スレッド・グループの全メンバーは同じ PID を共有する。 NPTL
679 は管理スレッド (manager thread) を利用しない。 NPTL は内部でリアルタイムシグナルのうち最初の 2つの番号を使用しており
680 (\fBsignal\fP(7)  参照)、これらのシグナルはアプリケーションでは使用できない。
681
682 NPTL にも POSIX.1 に準拠していない点が少なくとも一つある:
683 .IP \- 3
684 .\" FIXME . bug report filed for NPTL nice nonconformance
685 .\" http://bugzilla.kernel.org/show_bug.cgi?id=6258
686 .\" Sep 08: there is a patch by Denys Vlasenko to address this
687 .\" "make setpriority POSIX compliant; introduce PRIO_THREAD extension"
688 .\" Monitor this to see if it makes it into mainline.
689 スレッドは共通の nice 値を共有しない。
690 .PP
691 NPTL の標準非準拠な点のうちいくつかは以前のカーネルでのみ発生する:
692 .IP \- 3
693 \fBtimes\fP(2)  と \fBgetrusage\fP(2)  が返す情報がプロセス全体の情報でなくスレッド単位の情報である (カーネル 2.6.9
694 で修正された)。
695 .IP \- 3
696 スレッド間でリソース制限を共有しない (カーネル 2.6.10 で修正された)。
697 .IP \- 3
698 スレッド間でインターバル・タイマを共有しない (カーネル 2.6.12 で修正された)。
699 .IP \- 3
700 メインスレッドだけが \fBsetsid\fP(2)  を使って新しいセッションを開始することができる (カーネル 2.6.16 で修正された)。
701 .IP \- 3
702 メインスレッドだけが \fBsetpgid\fP(2)  を使ってそのプロセスをプロセス・グループ・リーダーにすることができる (カーネル 2.6.16
703 で修正された)。
704 .IP \- 3
705 スレッドはそれぞれの独自の代替シグナルスタックの設定を持つ。 しかし、新しいスレッドの代替シグナルスタックの設定は
706 そのスレッドを作成したスレッドからコピーされ、そのため スレッドは最初は一つの代替シグナルスタックを共有する (カーネル 2.6.16 で修正された)。
707 .PP
708 NPTL の実装では以下の点についても注意すること:
709 .IP \- 3
710 スタックサイズのリソースのソフト・リミット (\fBsetrlimit\fP(2)  の \fBRLIMIT_STACK\fP の説明を参照) が
711 \fIunlimited\fP 以外の値に設定されている場合、ソフト・リミットの値が 新しいスレッドのデフォルトのスタックサイズとなる。
712 設定を有効にするためには、プログラムを実行する前にリミット値を 設定しておかなければならない。たいていは、シェルの組み込みコマンドの \fIulimit
713 \-s\fP (C シェルでは \fIlimit stacksize\fP)  を使って設定する。
714 .SS スレッド実装の判定
715 glibc 2.3.2 以降では、 \fBgetconf\fP(1)  コマンドを使って、 システムのスレッド実装を判定することができる。 以下に例を示す:
716 .nf
717 .in +4n
718
719 bash$ getconf GNU_LIBPTHREAD_VERSION
720 NPTL 2.3.4
721 .in
722 .fi
723 .PP
724 ぞれ以前の glibc のバージョンでは、以下のようなコマンドで デフォルトのスレッド実装を判定することができる。
725 .nf
726 .in +4n
727
728 bash$ $( ldd /bin/ls | grep libc.so | awk \(aq{print $3}\(aq ) | \e
729                 egrep \-i \(aqthreads|ntpl\(aq
730         Native POSIX Threads Library by Ulrich Drepper et al
731 .in
732 .fi
733 .SS "スレッドの実装の選択: LD_ASSUME_KERNEL"
734 LinuxThreads と NPTL の両方をサポートしている glibc (glibc 2.3.\fIx\fP) があるシステムでは、
735 \fBLD_ASSUME_KERNEL\fP 環境変数を使うことで、動的リンカがデフォルトで 選択するスレッド実装を上書きすることができる。
736 この変数により、動的リンカが特定のバージョンのカーネル上で 動作していると仮定するように指定する。 NPTL
737 が必要とするサポート機能を提供していないカーネルバージョンを 指定することで、強制的に LinuxThreads を使うことができる
738 (このようなことをする最もありそうな場面は、 LinuxThreads の標準非準拠な振舞いに依存する (壊れた) アプリケーション
739 を動作させる場合だろう)。 以下に例を示す:
740 .nf
741 .in +4n
742
743 bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so | \e
744                 awk \(aq{print $3}\(aq ) | egrep \-i \(aqthreads|ntpl\(aq
745         linuxthreads\-0.10 by Xavier Leroy
746 .in
747 .fi
748 .SH 関連項目
749 .ad l
750 .nh
751 \fBclone\fP(2), \fBfutex\fP(2), \fBgettid\fP(2), \fBfutex\fP(7), \fBsigevent\fP(7),
752 \fBsignal\fP(7),
753 .br
754 および Pthreads の各種マニュアルページ、例えば: \fBpthread_attr_init\fP(3),
755 \fBpthread_atfork\fP(3), \fBpthread_cancel\fP(3), \fBpthread_cleanup_push\fP(3),
756 \fBpthread_cond_signal\fP(3), \fBpthread_cond_wait\fP(3), \fBpthread_create\fP(3),
757 \fBpthread_detach\fP(3), \fBpthread_equal\fP(3), \fBpthread_exit\fP(3),
758 \fBpthread_key_create\fP(3), \fBpthread_kill\fP(3), \fBpthread_mutex_lock\fP(3),
759 \fBpthread_mutex_unlock\fP(3), \fBpthread_once\fP(3),
760 \fBpthread_setcancelstate\fP(3), \fBpthread_setcanceltype\fP(3),
761 \fBpthread_setspecific\fP(3), \fBpthread_sigmask\fP(3), \fBpthread_sigqueue\fP(3),
762 and \fBpthread_testcancel\fP(3)