最近まで、スレッドを生成した後でスレッドを「切り離す」と、「メイン」スレッドが終了した後でもスレッドが存続するという印象を受けました。
しかし、小さな実験(以下にリスト)は私の信念に反しています。メインスレッドが終了した後も、切り離されたスレッドが「切り離されたスレッドから話す」と表示し続けると思っていましたが、これは発生していないようです。アプリケーションは明らかに終了します...
「切り離された」スレッドは、「メイン」の問題の後に死ぬかreturn?
#include <pthread.h>
#include <stdio.h>
void *func(void *data)
{
while (1)
{
printf("Speaking from the detached thread...\n");
sleep(5);
}
pthread_exit(NULL);
}
int main()
{
pthread_t handle;
if (!pthread_create(&handle, NULL, func, NULL))
{
printf("Thread create successfully !!!\n");
if ( ! pthread_detach(handle) )
printf("Thread detached successfully !!!\n");
}
sleep(5);
printf("Main thread dying...\n");
return 0;
}
Linuxプログラマーズマニュアル を引用するには:
Detached属性は、スレッドが終了したときのシステムの動作を決定するだけです。
exit(3)
を使用してプロセスが終了した場合(または、メインスレッドが戻った場合)にスレッドが終了するのを防ぐことはできません。
Linuxプログラマーズマニュアル からも:
他のスレッドが実行を継続できるようにするには、メインスレッドは
pthread_exit()
ではなくexit(3)
を呼び出して終了する必要があります。
pthread_detach
は、スレッドに再び参加しないことを意味します。これにより、pthreadライブラリは、スレッドが終了するとすぐにスレッドリソースを破棄できるか(デタッチされた場合)、または後でスレッドでpthread_join
を呼び出す可能性があるため、それらを保持する必要があるかどうかを知ることができます。
メインが戻る(または終了する)と、OSはすべてのスレッドを取得し、プロセスを破棄します。
pthread_detach
は、あなたが思っていることを実行しません-これは、指定されたIDのスレッドが使用しているスペースが終了するとすぐに再利用できることを実装に示します。番号 pthread_join
操作が実行されます。
スレッドを含むプロセスが終了すると、すべてのスレッドが終了します。
はい、切り離されたスレッドはreturn 0
の後に終了します。
man pthread_detach
のNOTESセクションから
Detached属性は、スレッドが終了したときのシステムの動作を決定するだけです。 exit(3)を使用してプロセスが終了した場合(または、メインスレッドが戻った場合と同等)に、スレッドが終了するのを防ぎません。
_man pthread_detach
_から:
pthread_detach()
関数は、threadによって識別されたスレッドを切り離されたものとしてマークします。切り離されたスレッドが終了すると、そのリソースは自動的にシステムに解放され、別のスレッドが終了したスレッドに参加する必要はありません。