スレッドを切り離された状態 (PTHREAD_CREATE_DETACHED) として生成すると、そのスレッドが終了するとすぐに、そのスレッド識別子とその他のリソースを再利用できます。呼び出しスレッドがスレッドの終了を待機しない場合は、pthread_attr_setdetachstate(3C) を使用してください。
int pthread_attr_setdetachstate(pthread_attr_t *tattr,int detachstate);
#include <pthread.h> pthread_attr_t tattr; int ret; /* set the thread detach state */ ret = pthread_attr_setdetachstate(&tattr,PTHREAD_CREATE_DETACHED);
PTHREAD_CREATE_JOINABLE により、スレッドが切り離されていない状態で生成された場合、アプリケーションはこのスレッドの完了を待機します。つまり、プログラムはスレッド上で pthread_join() を実行します。
スレッドが切り離された状態で生成されたか切り離されていない状態で生成されたかに関係なく、すべてのスレッドが終了するまでプロセスは終了しません。処理途中で main() から復帰することによって生じるプロセスの終了については、「スレッド終了処理の完了」を参照してください。
明示的な同期によって阻止されなければ、そのスレッドの生成元が pthread_create() から復帰する前に、新たに生成される切り離されたスレッドが終了し、そのスレッド識別子が別の新しいスレッドに割り当てられることがあります。
切り離されていないスレッドには、終了後にほかのスレッドが終了待ちを行う必要があります。そうしないと、このスレッドのリソースが新しいスレッドに解放されず、メモリーリークが発生することになります。終了待ちを行うつもりがない場合は、スレッド作成時に切り離されたスレッドとして作成してください。
#include <pthread.h> pthread_attr_t tattr; pthread_t tid; void *start_routine; void arg int ret; /* initialized with default attributes */ ret = pthread_attr_init (&tattr); ret = pthread_attr_setdetachstate (&tattr,PTHREAD_CREATE_DETACHED); ret = pthread_create (&tid, &tattr, start_routine, arg);
pthread_attr_setdetachstate() は、正常終了時に 0 を返します。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、この関数は失敗し、対応する値を返します。
EINVAL
説明:detachstate または tattr の値が無効です。