pthread_exit -
呼び出したスレッドを終了する
#include <pthread.h>
void pthread_exit(void *retval);
-pthread でコンパイルしてリンクする。
pthread_exit()
関数は、呼び出したスレッドを終了し、
retval
経由で値を返す。この値は
(そのスレッドが join
可能な場合に)
pthread_join(3)
を呼び出した同じプロセス内の別のスレッドが参照できる値と同じである。
pthread_cleanup_push(3)
で設定されたクリーンアップハンドラーのうち、まだ
pop (取り出されていない)
ハンドラーを (push
されたのと逆の順序で)
取り出して実行する。そのスレッドがスレッド固有のデータを持っている場合は、クリーンアップハンドラーが実行された後に、スレッド固有のデータに対応するデストラクタ
(destructor)
関数が呼び出される
(呼び出し順序は規定されていない)。
スレッドが終了する際に、プロセスの共有リソース
(例えば、mutex、状態変数
(condition
variables)、セマフォ、ファイルディスクリプター)
は解放されない。
atexit(3)
を使って登録された関数は呼び出されない。
プロセスの最後のスレッドが終了すると、そのプロセスは、終了ステータス
0 で
exit(3)
を呼び出した場合と全く同じように終了する。したがって、プロセスの共有リソースは解放され、
atexit(3)
を使って登録された関数が呼び出される。
この関数は呼び出し側には返らない。
この関数は常に成功する。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
pthread_exit() |
Thread safety |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
メインスレッド以外のスレッドの開始関数
(start function) がreturn を
行うと、暗黙のうちに
pthread_exit() が呼び出され、
関数の返り値がスレッドの終了ステータスとして使用される。
他のスレッドが実行を継続できるように、メインスレッドは
exit(3) では なく
pthread_exit()
を呼び出して終了すべきである。
retval
が指す値は、呼び出したスレッドのスタックに置くべきではない。
呼び出したスレッドが終了した後は、そのスタックの内容が不定となるから
である。
現在のところ、停止 (stop)
されたスレッドグループを、すでに終了した
(dead)
スレッドグループリーダーで
wait(2) する場合の、
カーネル実装の論理には制限がある。
この制限は、すでにスレッドグループリーダーが
pthread_exit() を
呼び出しているようなフォアグラウンドプロセスにストップシグナルが送信
された場合に、端末がロックされてしまう、といった問題として表に見える
場合がある。
pthread_create(3),
pthread_join(3),
pthreads(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。