スレッドを切り離された状態 (PTHREAD_CREATE_DETACHED) として生成すると、そのスレッドが終了するとすぐに、そのスレッド識別子とその他のリソースを再利用できます。呼び出したスレッドでスレッドの終了まで待ちたくない場合は、pthread_attr_setdetachstate(3T) を使用してください。
スレッドを切り離されていない状態 (PTHREAD_CREATE_JOINABLE) として生成すると、そのスレッドを待つものとみなされます。つまり、そのスレッドに対して pthread_join(3T) を実行するとみなされます。
スレッドが切り離された状態か切り離されていない状態で作成されたかに関係なく、すべてのスレッドが終了するまでプロセスは終了しません。「スレッド終了処理の完了」にある、main() から処理途中で戻ることによって生じるプロセスの終了の説明を参照して下さい。
プロトタイプ: int pthread_attr_setdetachstate(pthread_attr_t *tattr,int detachstate); #include <pthread.h> pthread_attr_t tattr; int ret; /* スレッド切り離し状態を設定する */ ret = pthread_attr_setdetachstate(&tattr,PTHREAD_CREATE_DETACHED); |
明示的な同期によって阻止されなければ、新たに生成される切り離されたスレッドは、そのスレッドの生成元が pthread_create() から復帰する前に終了でき、そのスレッド識別子は別の新しいスレッドに割り当てることができます。
切り離されていない (PTHREAD_CREATE_JOINABLE) スレッドについては、そのスレッドの終了後に他のスレッドが終了待ちを行うことがきわめて重要です。そうしないと、そのスレッドのリソースが新しいスレッドに解放されません。これは通常、メモリーリークを招くことになります。終了待ちを行うつもりがない場合は、スレッド作成時に切り離されたスレッドとして作成してください。
#include <pthread.h> pthread_attr_t tattr; pthread_t tid; void *start_routine; void arg int ret; /* デフォルト属性で初期化する */ ret = pthread_attr_init()(&tattr); ret = pthread_attr_setdetachstate()(&tattr,PTHREAD_CREATE_DETACHED); ret = pthread_create()(&tid, &tattr, start_routine, arg); |
正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、この関数は失敗し、対応する値を返します。