Silphire (7255) の日記

2003 年 01 月 16 日
午後 10:16

pthread日記(12) - pthread_exit()

現在実行中のスレッドを終了する

void pthread_exit(void *value_ptr);

現在実行しているスレッドを終了します。終了する時の戻り値として、value_ptrを与える事が出来ます。この関数は一見スレッドを終了するだけの簡単な関数に見えますが、実際には色々な副作用を伴います。

pthread_exit()を呼び出した後、以下のような事が起こります。

  • pthread_cleanup_push()でスタックに積んだcancellation cleanup handlerがまだ残っている場合は、それらを次々にスタックから取り出して実行する。
  • 全てのcancellation cleanup handlerの実行が終了したら、スレッド固有データに割り当てられたデストラクタが、順不同に実行される。

スレッドが終了する際には、mutexやファイルディスクリプタに代表されるプロセスの資源の解放や、atexit()のようなプロセスレベルのクリーンアップ処理は実行されません。なので、各自がきちんと後始末をする必要があります。

スレッド(メインスレッドは除く)を作成した関数が関数から抜ける時に、暗黙のうちにpthread_exit()が呼び出されます。

cancellation cleanup handlerやデストラクタからpthread_exit()を実行した時の結果は不定です。これは暗黙の内にpthread_exit()が実行された時も該当するので、注意が必要です。

スレッドが終了した後、そのスレッドが持っていた自動変数の領域は未定義になります。なので、pthread_exit()にスレッドの戻り値として与えるvalue_ptrが参照する変数に自動変数を使ってはいけません。

最後の1つのスレッドが終了すると、プロセスは戻り値0で終了します。この終了は、exit()に引数0を与えた時の終了の仕方と同じです。すなわち、atexit()なども実行されます。

pthread_exit()は実行された後、2度と実行元に戻る事はありません。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

処理中...