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);