2 .\" Copyright (c) 2005 by Michael Kerrisk <mtk.manpages@gmail.com>
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.
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.
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
21 .\" Formatted or processed versions of this manual, if unaccompanied by
22 .\" the source, must acknowledge the copyright and authors of this work.
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
33 .\"WORD: manager thread 管理スレッド
34 .\"WORD: thread group スレッド・グループ
35 .\"WORD: real-time signal リアルタイムシグナル
36 .\"WORD: non-conformant 標準非準拠の
37 .\"WORD: alternate signal stack 代替シグナルスタック
39 .TH PTHREADS 7 2008-11-18 "Linux" "Linux Programmer's Manual"
41 pthreads \- POSIX スレッド
43 POSIX.1 は、一般に POSIX スレッドや Pthreads として知られる
44 スレッド・プログラミングのインタフェース群 (関数、ヘッダファイル)
45 を規定している。一つのプロセスは複数のスレッドを持つことができ、
47 これらのスレッドは同じ大域メモリ (データとヒープ領域) を共有するが、
48 各スレッドは自分専用のスタック (自動変数) を持つ。
50 POSIX.1 はスレッド間でどのような属性を共有するかについても定めている
51 (つまり、これらの属性はスレッド単位ではなくプロセス全体で共通である):
82 .RB ( timer_create (2))
85 .RB ( setpriority (2))
96 スタックについても、POSIX.1 はどのような属性が
97 個々のスレッドで独立に管理されるかを規定している:
104 .RB ( pthread_sigmask (3))
110 .RB ( sigaltstack (2))
112 リアルタイム・スケジューリングのポリシーと優先度
113 .RB ( sched_setscheduler (2)
115 .BR sched_setparam (2))
117 以下の Linux 特有の機能もスレッド単位である:
120 .RB ( capabilities (7)
124 .RB ( sched_setaffinity (2))
125 .SS "pthreads 関数の返り値"
126 ほとんどの pthreads 関数は成功すると 0 を返し、
132 エラーを返す可能性のある pthreads 関数がエラー
134 で失敗することは決してないと規定している。
140 .BR pthread_create (3)
141 の呼び出し元に返される。また、スレッドは自身のスレッド識別子を
144 スレッド ID の一意性が保証されるのは、一つのプロセス内においてのみである。
145 終了したスレッドが join された後では、スレッド ID は再利用される可能性がある。
146 スレッド ID を引き数に取る全てのスレッド関数において、
147 その ID は呼び出し元と同じプロセス内の一つのスレッドを参照する。
149 スレッドセーフな関数は、複数のスレッドから同時に呼び出しても安全な
150 (すなわち、同時に呼び出されたかに関わらず、同じ結果を返す) 関数のことである。
152 POSIX.1-2001 と POSIX.1-2008では、一部の例外を除き、
153 標準で規定されている全ての関数がスレッドセーフであることを要求している。
162 ctermid() (NULL でない引き数を渡された場合)
176 ecvt() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
181 fcvt() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
183 gcvt() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
191 gethostbyaddr() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
192 gethostbyname() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
239 strsignal() [POSIX.1-2008 で追加された]
241 system() [POSIX.1-2008 で追加された]
242 tmpnam() (NULL でない引き数を渡された場合)
245 wcrtomb() (最後の引き数が NULL の場合)
246 wcsrtombs() (最後の引き数が NULL の場合)
251 .SS 取り消しポイント (cancellation points)
252 POSIX.1 の規定では、特定の関数は取り消しポイントでなければならず、
253 他の特定の関数は取り消しポイントであってもよいとされている。
254 あるスレッドが取り消し可能で、その取り消し種別 (cancelability type)
255 が延期 (deferred) で、そのスレッドに対する取り消し要求が処理待ちの場合、
256 取り消しポイントである関数を呼び出した時点で、そのスレッドのキャンセルが
259 POSIX.1-2001 と POSIX.1-2008 の両方、もしくはいずれか一方では、
260 以下の関数は、取り消しポイント (cancellation points) で
264 .\" Document the list of all functions that are cancellation points in glibc
288 openat() [POSIX.1-2008 で追加された]
293 pthread_cond_timedwait()
311 sigpause() [POSIX.1-2001 only (moves to "may" list in POSIX.1-2008)]
319 usleep() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
328 POSIX.1-2001 と POSIX.1-2008 の両方、もしくはいずれか一方では、
329 以下の関数は、取り消しポイント (cancellation points) で
340 chmod() [POSIX.1-2008 で追加された]
341 chown() [POSIX.1-2008 で追加された]
355 dprintf() [POSIX.1-2008 で追加された]
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 で追加された]
369 fcntl() (cmd 引き数が何であっても)
391 fstatat() [POSIX.1-2008 で追加された]
395 futimens() [POSIX.1-2008 で追加された]
406 getdelim() [POSIX.1-2008 で追加された]
412 gethostbyaddr() [SUSv3 のみ (この関数は POSIX.1-2008 で削除されている)]
413 gethostbyname() [SUSv3 のみ (この関数は POSIX.1-2008 で削除されている)]
417 getline() [POSIX.1-2008 で追加された]
424 getopt() (opterr が 0 以外の場合)
442 getwd() [SUSv3 のみ (この関数は POSIX.1-2008 で削除されている)]
448 linkat() [POSIX.1-2008 で追加された]
449 lio_listio() [POSIX.1-2008 で追加された]
452 lockf() [POSIX.1-2008 で追加された]
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 で追加された]
480 posix_trace_create_withlog()
481 posix_trace_eventtypelist_getnext_id()
482 posix_trace_eventtypelist_rewind()
484 posix_trace_get_attr()
485 posix_trace_get_filter()
486 posix_trace_get_status()
487 posix_trace_getnext_event()
490 posix_trace_set_filter()
491 posix_trace_shutdown()
492 posix_trace_timedgetnext_event()
493 posix_typed_mem_open()
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()
511 readlink() [POSIX.1-2008 で追加された]
512 readlinkat() [POSIX.1-2008 で追加された]
515 renameat() [POSIX.1-2008 で追加された]
518 scandir() [POSIX.1-2008 で追加された]
529 sigpause() [POSIX.1-2008 で追加された]
535 symlinkat() [POSIX.1-2008 で追加された]
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 で追加された]
562 実装時に、標準規格で規定されていないその他の関数を取り消しポイント
564 特に、停止 (block) する可能性がある非標準の関数を取り消しポイントと
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:
609 .\" getprotobynumber_r
624 .\" getwchar_unlocked
631 .\" pthread_timedjoin_np
637 .\" putwchar_unlocked
658 Linux では、Pthreads API を用いたプログラムは
661 .SS "POSIX スレッドの Linux での実装"
662 これまで、2つのスレッドの実装が Linux の GNU C ライブラリにより
667 glibc 2.4 以降は、この実装はもはやサポートされていない。
669 .BR NPTL " (Native POSIX Threads Library)"
670 新しい Pthreads の実装。LinuxThreads と比べると、
671 NPTL は POSIX.1 の要求仕様への準拠の度合いが高く、
673 NPTL は glibc 2.3.2 以降で利用可能である。
674 NPTL を利用するには Linux 2.6 カーネルに実装されている機能が必要である。
676 どちらの実装もいわゆる 1:1 実装、すなわち個々のスレッドが
677 カーネルのスケジューリング実体にマッピングされる。
681 NPTL では、スレッド同期の基本機構 (mutex や スレッドの join 等) は
688 メインスレッド (最初のスレッド) とプログラムが
689 .BR pthread_create (3)
691 この実装では「管理 (manager)」スレッドが作成される。
692 管理スレッドはスレッドの作成と終了を取り扱う
693 (このスレッドがうっかり kill されると、問題が起こることがある)。
695 この実装では内部でシグナルを使用している。
696 Linux 2.2 以降では、リアルタイムシグナルのうち最初の 3つが使われる
704 アプリケーションは、スレッド実装で利用されているシグナルを
708 (実際には LinuxThreads のスレッドは通常よりは情報を共有するプロセスとして
709 実装されているが、一つの共通のプロセス ID を共有してはいない)。
710 (管理スレッドを含む) LinuxThreads スレッドは
714 LinuxThreads の実装では POSIX.1 仕様から逸脱している点が
718 を呼び出したときに、スレッド毎に異なる値が返される。
722 を呼び出すと、管理スレッドのプロセス ID が返される。
734 できるべきである。しかしながら、この実装では子プロセスを作成した
741 を呼び出した場合、他のスレッドは全て終了される (POSIX.1 の仕様通り)。
744 を呼んだスレッドと同じ PID を持つ。正しくは
745 メインスレッドと同じ PID を持つべきである。
747 スレッド間でユーザ ID とグループ ID が共有されない
748 このことは、set-user-ID プログラムで面倒な事態を招いたり、
751 などを使って信用情報 (credentials) を変更した場合に
752 Pthreads 関数が失敗する原因となる。
754 スレッド間で共通のセッション ID やプロセスグループ ID を共有しない。
758 を使って作成されるレコード・ロックを共有しない。
763 が返す情報がプロセス全体の情報でなくスレッド単位の情報である。
769 スレッド間でインターバル・タイマを共有しない。
771 スレッドは共通の nice 値を共有しない。
773 POSXI.1 では、全体としてのプロセスに送られるシグナルと、
774 個別のスレッドに送られるシグナルを区別して考えている。
775 POSIX.1 によると、プロセスに送られたシグナル (例えば
777 を使って送る) は、そのプロセスに属すスレッドのうち
778 勝手に (arbitrarily) に選択された一つのスレッドにより処理される
779 ことになっている。LinuxThreads はプロセスに送られるシグナルの
780 概念に対応しておらず、シグナルは特定のスレッドにだけ送ることができる。
782 スレッドはそれぞれの独自の代替シグナルスタックの設定を持つ。
783 しかし、新しいスレッドの代替シグナルスタックの設定は
784 そのスレッドを作成したスレッドからコピーされ、そのため
785 スレッドは最初は一つの代替シグナルスタックを共有する。
786 (仕様では、新しいスレッドは代替シグナルスタックが定義されていない状態
788 2つのスレッドが共有されている代替シグナルスタック上で同時に
789 シグナルの処理を行った場合、予測不可能なプログラムのエラーが
792 NPTL では、一つのプロセスの全てのスレッドは同じスレッド・グループ
793 に属する; スレッド・グループの全メンバーは同じ PID を共有する。
794 NPTL は管理スレッド (manager thread) を利用しない。
795 NPTL は内部でリアルタイムシグナルのうち最初の 2つの番号を使用しており
797 参照)、これらのシグナルはアプリケーションでは使用できない。
799 NPTL にも POSIX.1 に準拠していない点が少なくとも一つある:
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.
808 NPTL の標準非準拠な点のうちいくつかは以前のカーネルでのみ発生する:
813 が返す情報がプロセス全体の情報でなくスレッド単位の情報である
816 スレッド間でリソース制限を共有しない (カーネル 2.6.10 で修正された)。
818 スレッド間でインターバル・タイマを共有しない
819 (カーネル 2.6.12 で修正された)。
823 を使って新しいセッションを開始することができる
824 (カーネル 2.6.16 で修正された)。
828 を使ってそのプロセスをプロセス・グループ・リーダーにすることができる
829 (カーネル 2.6.16 で修正された)。
831 スレッドはそれぞれの独自の代替シグナルスタックの設定を持つ。
832 しかし、新しいスレッドの代替シグナルスタックの設定は
833 そのスレッドを作成したスレッドからコピーされ、そのため
834 スレッドは最初は一つの代替シグナルスタックを共有する
835 (カーネル 2.6.16 で修正された)。
837 NPTL の実装では以下の点についても注意すること:
839 スタックサイズのリソースのソフト・リミット
845 以外の値に設定されている場合、ソフト・リミットの値が
846 新しいスレッドのデフォルトのスタックサイズとなる。
847 設定を有効にするためには、プログラムを実行する前にリミット値を
848 設定しておかなければならない。たいていは、シェルの組み込みコマンドの
851 .IR "limit stacksize" )
857 システムのスレッド実装を判定することができる。
862 bash$ getconf GNU_LIBPTHREAD_VERSION
867 ぞれ以前の glibc のバージョンでは、以下のようなコマンドで
868 デフォルトのスレッド実装を判定することができる。
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
877 .SS "スレッドの実装の選択: LD_ASSUME_KERNEL"
878 LinuxThreads と NPTL の両方をサポートしている glibc
879 (glibc 2.3.\fIx\fP) があるシステムでは、
881 環境変数を使うことで、動的リンカがデフォルトで
882 選択するスレッド実装を上書きすることができる。
883 この変数により、動的リンカが特定のバージョンのカーネル上で
885 NPTL が必要とするサポート機能を提供していないカーネルバージョンを
886 指定することで、強制的に LinuxThreads を使うことができる
887 (このようなことをする最もありそうな場面は、
888 LinuxThreads の標準非準拠な振舞いに依存する (壊れた) アプリケーション
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
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)