マルチスレッドのプログラミング

スレッドの終了待ち

pthread_join(3THR)

pthread_join(3THR) 関数は、スレッドの終了を待ちます。


プロトタイプ:
int	pthread_join(thread_t tid, void **status);

#include <pthread.h>

pthread_t tid;
int ret;
void *status;

/* スレッド「tid」の終了待ち、status の指定あり */
ret = pthread_join(tid, &status);

/* スレッド「tid」の終了待ち、status の指定は NULL */
ret = pthread_join(tid, NULL); 

pthread_join() 関数は、指定したスレッドが終了するまで呼び出しスレッドをブロックします。

指定するスレッドは、現在のプロセス内のスレッドで、しかも切り離されていないものでなければなりません。スレッドの切り離しについては、切り離し状態の設定を参照してください。

status が NULL でなければ、pthread_join() の正常終了時に status の指す記憶場所に終了したスレッドの終了状態が格納されます。

複数のスレッドが同一スレッドの終了を待機している場合は、そのスレッドが終了すると、待機していた 1 つのスレッドが正常終了し、その他のスレッドは失敗して ESRCH エラーを返します。

pthread_join() の復帰後は、そのスレッドに関連付けられていたデータ領域がそのアプリケーションで再利用できるようになります。

戻り値

正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下のいずれかの条件が検出されると、pthread_join() は失敗し、次の値を返します。


ESRCH

tid は、現在のプロセスの中の有効な切り離されていないスレッドではありません。


EDEADLK

デッドロックが発生しています。たとえば、スレッドが自身を待機していたり、スレッド A とスレッド B が互いに待機し合っていたりします。


EINVAL

tid の値が無効です。

pthread_join() は、切り離されていないスレッドに対してだけ有効であることに注意してください。終了時のタイミングで特に同期をとる必要がないスレッドは、切り離して生成してください。