同じプロセス内のメインスレッドと他のスレッドについて問題があります。メイン関数が戻ると、他のスレッドも終了しますか?私はこれについて混乱しています。
次のテストコードを検討してください。
void* test1(void *arg)
{
unsigned int i = 0;
while (1){
i+=1;
}
return NULL;
}
void* test2(void *arg)
{
long double i = 1.0;
while (1){
i *= 1.1;
}
return NULL;
}
void startThread ( void * (*run)(void*), void *arg) {
pthread_t t;
pthread_attr_t attr;
if (pthread_attr_init(&attr) != 0
|| pthread_create(&t, &attr, run, arg) != 0
|| pthread_attr_destroy(&attr) != 0
|| pthread_detach(t) != 0) {
printf("Unable to launch a thread\n");
exit(1);
}
}
int main()
{
startThread(test1, NULL);
startThread(test2, NULL);
sleep(4);
printf("main thread return.\n");
return 0;
}
「メインスレッドが戻る」とき。印刷、スレッドtest1とtest2も終了します。理由を教えてもらえますか?
メインスレッドが戻る(つまり、main
関数から戻る)と、プロセス全体が終了します。これには他のすべてのスレッドが含まれます。 exit
を呼び出すと、同じことが起こります。これを回避するには、pthread_exit
を呼び出します。
pthread_detach
の目的は、リソースを解放するために他のスレッドと結合する必要がないようにすることです。スレッドを切り離しても、プロセスの終了後は存在しません。他のすべてのスレッドと一緒に破棄されます。
新しいスレッドのそれぞれで pthread_join()
を使用して、呼び出し側のスレッドにサブスレッドで待機し、実行を停止してプロセスを終了するよう通知して、それらのスレッドが終了するまで待ちます。
作成されたスレッドで pthread_detach
を呼び出してもプロセスが終了した後も保持されません。 Linuxから man page :
Detached属性は、スレッドが終了したときのシステムの動作を決定するだけです。プロセスがexit(3)を使用して終了した場合(または、メインスレッドが戻った場合)にスレッドが終了することを妨げません。
pthread_exit
がmain
に明示的にpthread_join
呼び出しの代わりに使用されることがあります。この目的は、このようにmain
を終了することです。他のスレッドが実行を継続できるようにします。実際、 linux man page はこれを明示的に述べています:
他のスレッドが実行を継続できるようにするには、メインスレッドは、exit(3)ではなくpthread_exit()を呼び出して終了する必要があります。
しかし、これがすべてのプラットフォームで予想される動作であるかどうかはわかりません。また、常にpthread_join
を使用することにこだわっています。
pthread_join
にはターゲットスレッドのpthread_t
が必要です。したがって、pthread_join
を呼び出して両方を待機する前に両方のスレッドを作成する必要があるため、コードを少し変更する必要があります。したがって、startThread
で呼び出すことはできません。 pthread_t
を返すか、pthread_t
へのポインターをstartThread
関数に渡す必要があります。