.SH 名前
pthreads \- POSIX スレッド
.SH 説明
-POSIX.1 ã\81¯ã\80\81ä¸\80è\88¬ã\81« POSIX ã\82¹ã\83¬ã\83\83ã\83\89ã\82\84 Pthreads ã\81¨ã\81\97ã\81¦ç\9f¥ã\82\89ã\82\8cã\82\8b ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\83\97ã\83ã\82°ã\83©ã\83\9fã\83³ã\82°ã\81®ã\82¤ã\83³ã\82¿フェース群
-(関数、ヘッダファイル) を規定している。一つのプロセスは複数のスレッドを持つことができ、 全てのスレッドは同じプログラムを実行する。
-これらのスレッドは同じ大域メモリ (データとヒープ領域) を共有するが、 各スレッドは自分専用のスタック (自動変数) を持つ。
+POSIX.1 ã\81¯ã\80\81ä¸\80è\88¬ã\81« POSIX ã\82¹ã\83¬ã\83\83ã\83\89ã\82\84 Pthreads ã\81¨ã\81\97ã\81¦ç\9f¥ã\82\89ã\82\8cã\82\8b ã\82¹ã\83¬ã\83\83ã\83\89ã\83\97ã\83ã\82°ã\83©ã\83\9fã\83³ã\82°ã\81®ã\82¤ã\83³ã\82¿ã\83¼フェース群
+(é\96¢æ\95°ã\80\81ã\83\98ã\83\83ã\83\80ã\83¼ã\83\95ã\82¡ã\82¤ã\83«) ã\82\92è¦\8få®\9aã\81\97ã\81¦ã\81\84ã\82\8bã\80\82ä¸\80ã\81¤ã\81®ã\83\97ã\83ã\82»ã\82¹ã\81¯è¤\87æ\95°ã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\82\92æ\8c\81ã\81¤ã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\80\81 å\85¨ã\81¦ã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\81¯å\90\8cã\81\98ã\83\97ã\83ã\82°ã\83©ã\83 ã\82\92å®\9fè¡\8cã\81\99ã\82\8bã\80\82
+これらのスレッドは同じ大域メモリー (データとヒープ領域) を共有するが、 各スレッドは自分専用のスタック (自動変数) を持つ。
POSIX.1 はスレッド間でどのような属性を共有するかについても定めている (つまり、これらの属性はスレッド単位ではなくプロセス全体で共通である):
.IP \- 3
.IP \- 3
制御端末
.IP \- 3
-ユーザ ID とグループ ID
+ユーザー ID とグループ ID
.IP \- 3
-オープンするファイルディスクリプタ
+オープンするファイルディスクリプター
.IP \- 3
レコードのロック (\fBfcntl\fP(3) 参照)
.IP \- 3
.IP \- 3
ファイルモード作成マスク (\fBumask\fP(2))
.IP \- 3
-ã\82«ã\83¬ã\83³ã\83\88ã\83»ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ª (\fBchdir\fP(2)) ã\81¨ã\83«ã\83¼ã\83\88ã\83»ディレクトリ (\fBchroot\fP(2))
+ã\82«ã\83¬ã\83³ã\83\88ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ª (\fBchdir\fP(2)) ã\81¨ã\83«ã\83¼ã\83\88ディレクトリ (\fBchroot\fP(2))
.IP \- 3
-ã\82¤ã\83³ã\82¿ã\83¼ã\83\90ã\83«ã\83»ã\82¿ã\82¤ã\83\9e (\fBsetitimer\fP(2)) ã\81¨ POSIX ã\82¿ã\82¤ã\83\9e (\fBtimer_create\fP(2))
+ã\82¤ã\83³ã\82¿ã\83¼ã\83\90ã\83«ã\82¿ã\82¤ã\83\9eã\83¼ (\fBsetitimer\fP(2)) ã\81¨ POSIX ã\82¿ã\82¤ã\83\9eã\83¼ (\fBtimer_create\fP(2))
.IP \- 3
nice 値 (\fBsetpriority\fP(2))
.IP \- 3
.IP \- 3
代替シグナルスタック (\fBsigaltstack\fP(2))
.IP \- 3
-ã\83ªã\82¢ã\83«ã\82¿ã\82¤ã\83 ã\83»ã\82¹ã\82±ã\82¸ã\83¥ã\83¼ã\83ªã\83³ã\82°ã\81®ã\83\9dã\83ªã\82·ã\83¼ã\81¨å\84ªå\85\88度 (\fBsched\fP(7))
+リアルタイムスケジューリングのポリシーと優先度 (\fBsched\fP(7))
.PP
以下の Linux 特有の機能もスレッド単位である:
.IP \- 3
しかしながら、新しいプロセスは \fBexecve\fP(2) を呼んだスレッドと同じ PID を持つ。正しくは メインスレッドと同じ PID
を持つべきである。
.IP \- 3
-スレッド間でユーザ ID とグループ ID が共有されない このことは、set\-user\-ID プログラムで面倒な事態を招いたり、 アプリケーションが
+スレッド間でユーザー ID とグループ ID が共有されない このことは、set\-user\-ID プログラムで面倒な事態を招いたり、 アプリケーションが
\fBseteuid\fP(2) などを使って信用情報 (credentials) を変更した場合に Pthreads 関数が失敗する原因となる。
.IP \- 3
スレッド間で共通のセッション ID やプロセスグループ ID を共有しない。
.IP \- 3
-ã\82¹ã\83¬ã\83\83ã\83\89é\96\93ã\81§ \fBfcntl\fP(2) ã\82\92使ã\81£ã\81¦ä½\9cæ\88\90ã\81\95ã\82\8cã\82\8bã\83¬ã\82³ã\83¼ã\83\89ã\83»ã\83ã\83\83ã\82¯ã\82\92å\85±æ\9c\89ã\81\97ã\81ªã\81\84ã\80\82
+スレッド間で \fBfcntl\fP(2) を使って作成されるレコードロックを共有しない。
.IP \- 3
\fBtimes\fP(2) と \fBgetrusage\fP(2) が返す情報がプロセス全体の情報でなくスレッド単位の情報である。
.IP \- 3
スレッド間でセマフォのアンドゥ値 (\fBsemop\fP(2) 参照) を共有しない。
.IP \- 3
-ã\82¹ã\83¬ã\83\83ã\83\89é\96\93ã\81§ã\82¤ã\83³ã\82¿ã\83¼ã\83\90ã\83«ã\83»ã\82¿ã\82¤ã\83\9eを共有しない。
+ã\82¹ã\83¬ã\83\83ã\83\89é\96\93ã\81§ã\82¤ã\83³ã\82¿ã\83¼ã\83\90ã\83«ã\82¿ã\82¤ã\83\9eã\83¼を共有しない。
.IP \- 3
スレッドは共通の nice 値を共有しない。
.IP \- 3
(仕様では、新しいスレッドは代替シグナルスタックが定義されていない状態 で開始されるべきとされている。
2つのスレッドが共有されている代替シグナルスタック上で同時に シグナルの処理を行った場合、予測不可能なプログラムのエラーが 起こり得る。)
.SS NPTL
-NPTL ã\81§ã\81¯ã\80\81ä¸\80ã\81¤ã\81®ã\83\97ã\83ã\82»ã\82¹ã\81®å\85¨ã\81¦ã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\81¯å\90\8cã\81\98ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97 ã\81«å±\9eã\81\99ã\82\8b; ã\82¹ã\83¬ã\83\83ã\83\89ã\83»グループの全メンバーは同じ PID を共有する。 NPTL
+NPTL ã\81§ã\81¯ã\80\81ä¸\80ã\81¤ã\81®ã\83\97ã\83ã\82»ã\82¹ã\81®å\85¨ã\81¦ã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\81¯å\90\8cã\81\98ã\82¹ã\83¬ã\83\83ã\83\89ã\82°ã\83«ã\83¼ã\83\97 ã\81«å±\9eã\81\99ã\82\8b; ã\82¹ã\83¬ã\83\83ã\83\89グループの全メンバーは同じ PID を共有する。 NPTL
は管理スレッド (manager thread) を利用しない。 NPTL は内部でリアルタイムシグナルのうち最初の 2つの番号を使用しており
(\fBsignal\fP(7) 参照)、これらのシグナルはアプリケーションでは使用できない。
.IP \- 3
スレッド間でリソース制限を共有しない (カーネル 2.6.10 で修正された)。
.IP \- 3
-ã\82¹ã\83¬ã\83\83ã\83\89é\96\93ã\81§ã\82¤ã\83³ã\82¿ã\83¼ã\83\90ã\83«ã\83»ã\82¿ã\82¤ã\83\9eを共有しない (カーネル 2.6.12 で修正された)。
+ã\82¹ã\83¬ã\83\83ã\83\89é\96\93ã\81§ã\82¤ã\83³ã\82¿ã\83¼ã\83\90ã\83«ã\82¿ã\82¤ã\83\9eã\83¼を共有しない (カーネル 2.6.12 で修正された)。
.IP \- 3
メインスレッドだけが \fBsetsid\fP(2) を使って新しいセッションを開始することができる (カーネル 2.6.16 で修正された)。
.IP \- 3
-ã\83¡ã\82¤ã\83³ã\82¹ã\83¬ã\83\83ã\83\89ã\81 ã\81\91ã\81\8c \fBsetpgid\fP(2) ã\82\92使ã\81£ã\81¦ã\81\9dã\81®ã\83\97ã\83ã\82»ã\82¹ã\82\92ã\83\97ã\83ã\82»ã\82¹ã\83»ã\82°ã\83«ã\83¼ã\83\97ã\83»リーダーにすることができる (カーネル 2.6.16
+ã\83¡ã\82¤ã\83³ã\82¹ã\83¬ã\83\83ã\83\89ã\81 ã\81\91ã\81\8c \fBsetpgid\fP(2) ã\82\92使ã\81£ã\81¦ã\81\9dã\81®ã\83\97ã\83ã\82»ã\82¹ã\82\92ã\83\97ã\83ã\82»ã\82¹ã\82°ã\83«ã\83¼ã\83\97リーダーにすることができる (カーネル 2.6.16
で修正された)。
.IP \- 3
スレッドはそれぞれの独自の代替シグナルスタックの設定を持つ。 しかし、新しいスレッドの代替シグナルスタックの設定は
.PP
NPTL の実装では以下の点についても注意すること:
.IP \- 3
-ã\82¹ã\82¿ã\83\83ã\82¯ã\82µã\82¤ã\82ºã\81®ã\83ªã\82½ã\83¼ã\82¹ã\81®ã\82½ã\83\95ã\83\88ã\83»ã\83ªã\83\9fã\83\83ã\83\88 (\fBsetrlimit\fP(2) ã\81® \fBRLIMIT_STACK\fP ã\81®èª¬æ\98\8eã\82\92å\8f\82ç\85§) ã\81\8c
-\fIunlimited\fP 以å¤\96ã\81®å\80¤ã\81«è¨å®\9aã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bå ´å\90\88ã\80\81ã\82½ã\83\95ã\83\88ã\83»ã\83ªã\83\9fã\83\83ã\83\88ã\81®å\80¤ã\81\8c æ\96°ã\81\97ã\81\84ã\82¹ã\83¬ã\83\83ã\83\89ã\81®ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81®ã\82¹ã\82¿ã\83\83ã\82¯ã\82µã\82¤ã\82ºã\81¨ã\81ªã\82\8bã\80\82
+スタックサイズのリソースのソフトリミット (\fBsetrlimit\fP(2) の \fBRLIMIT_STACK\fP の説明を参照) が
+\fIunlimited\fP 以外の値に設定されている場合、ソフトリミットの値が 新しいスレッドのデフォルトのスタックサイズとなる。
設定を有効にするためには、プログラムを実行する前にリミット値を 設定しておかなければならない。たいていは、シェルの組み込みコマンドの \fIulimit
\-s\fP (C シェルでは \fIlimit stacksize\fP) を使って設定する。
.SS スレッド実装の判定
.fi
.SS "スレッドの実装の選択: LD_ASSUME_KERNEL"
LinuxThreads と NPTL の両方をサポートしている glibc (glibc 2.3.\fIx\fP) があるシステムでは、
-\fBLD_ASSUME_KERNEL\fP 環境変数を使うことで、動的リンカがデフォルトで 選択するスレッド実装を上書きすることができる。
-この変数により、動的リンカが特定のバージョンのカーネル上で 動作していると仮定するように指定する。 NPTL
+\fBLD_ASSUME_KERNEL\fP ç\92°å¢\83å¤\89æ\95°ã\82\92使ã\81\86ã\81\93ã\81¨ã\81§ã\80\81å\8b\95ç\9a\84ã\83ªã\83³ã\82«ã\83¼ã\81\8cã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81§ é\81¸æ\8a\9eã\81\99ã\82\8bã\82¹ã\83¬ã\83\83ã\83\89å®\9fè£\85ã\82\92ä¸\8aæ\9b¸ã\81\8dã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\82\8bã\80\82
+ã\81\93ã\81®å¤\89æ\95°ã\81«ã\82\88ã\82\8aã\80\81å\8b\95ç\9a\84ã\83ªã\83³ã\82«ã\83¼ã\81\8cç\89¹å®\9aã\81®ã\83\90ã\83¼ã\82¸ã\83§ã\83³ã\81®ã\82«ã\83¼ã\83\8dã\83«ä¸\8aã\81§ å\8b\95ä½\9cã\81\97ã\81¦ã\81\84ã\82\8bã\81¨ä»®å®\9aã\81\99ã\82\8bã\82\88ã\81\86ã\81«æ\8c\87å®\9aã\81\99ã\82\8bã\80\82 NPTL
が必要とするサポート機能を提供していないカーネルバージョンを 指定することで、強制的に LinuxThreads を使うことができる
(このようなことをする最もありそうな場面は、 LinuxThreads の標準非準拠な振舞いに依存する (壊れた) アプリケーション
を動作させる場合だろう)。 以下に例を示す:
.in +4n
bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so | \e
- awk \(aq{print $3}\(aq ) | egrep \-i \(aqthreads|ntpl\(aq
+ awk \(aq{print $3}\(aq ) | egrep \-i \(aqthreads|nptl\(aq
linuxthreads\-0.10 by Xavier Leroy
.in
.fi
\fBpthread_setspecific\fP(3), \fBpthread_sigmask\fP(3), \fBpthread_sigqueue\fP(3),
and \fBpthread_testcancel\fP(3)
.SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.68 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。