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

スレッドの終了待ち

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

pthread_join の構文

スレッドの終了待ちを行うには、pthread_join(3C) を使用します。

int pthread_join(pthread_t tid, void **status);
#include <pthread.h>

pthread_t tid;
int ret;
void *status;

/* waiting to join thread "tid" with status */
ret = pthread_join(tid, &status);

/* waiting to join thread "tid" without status */
ret = pthread_join(tid, NULL); 

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

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

複数のスレッドが同じスレッドの終了を待つ場合、すべてのスレッドはそのスレッドが終了するまで待機します。そして、待機しているスレッドの 1 つが成功を返します。待機しているほかのスレッドは ESRCH エラーを返して失敗します。

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

pthread_join の戻り値

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


ESRCH

説明:

指定のスレッド ID に対応するスレッドが見つかりません。


EDEADLK

説明:

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


EINVAL

説明:

指定のスレッド ID に対応するスレッドは、切り離されています。

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