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

pthread_join(3T)

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


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

#include <pthread.h>

pthread_t tid;
int ret;
int status;

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

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

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

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

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

複数のスレッドが、同じスレッドの終了を待つことはできません。そのような状態が発生すると、あるスレッドは正常に戻りますが、他のスレッドは ESRCH エラーを戻し失敗します。

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

戻り値

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


ESRCH

tid で指定したスレッドは、現在のプロセス内の切り離されていない正しいスレッドでありません。


EDEADLK

tid に呼び出しスレッドを指定しました。


EINVAL

tid の値が無効です。

pthread_join() ルーチンの引数は 2 つあり、ある程度柔軟な使い方ができます。特定のスレッドが終了するまで待つ場合は、そのスレッドの識別子を第 1 引数として指定します。

終了したスレッドの終了コードを調べたい場合は、それを受け取る領域のアドレスを指定します。

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

切り離されたスレッドが頻繁に使用するスレッドであり、切り離されていないスレッドは特に必要な場合に限って使用するものと考えてください。