pthread_exit(3) 呼び出したスレッドを終了する

書式

#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) を使って登録された関数 が呼び出される。

返り値

この関数は呼び出し側には返らない。

エラー

この関数は常に成功する。

準拠

POSIX.1-2001.

注意

メインスレッド以外のスレッドの開始関数 (start function) がreturn を 行うと、暗黙のうちに pthread_exit() が呼び出され、 関数の返り値がスレッドの終了ステータスとして使用される。

他のスレッドが実行を継続できるように、メインスレッドは exit(3) では なく pthread_exit() を呼び出して終了すべきである。

retval が指す値は、呼び出したスレッドのスタックに置くべきではない。 呼び出したスレッドが終了した後は、そのスタックの内容が不定となるから である。

バグ

現在のところ、停止 (stop) されたスレッドグループを、すでに終了した (dead) スレッドグループリーダーで wait(2) する場合の、 カーネル実装の論理には制限がある。 この制限は、すでにスレッドグループリーダーが pthread_exit() を 呼び出しているようなフォアグラウンドプロセスにストップシグナルが送信 された場合に、端末がロックされてしまう、といった問題として表に見える 場合がある。

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。