web-dev-qa-db-ja.com

メインスレッドが終了すると、他のスレッドも終了しますか?

同じプロセス内のメインスレッドと他のスレッドについて問題があります。メイン関数が戻ると、他のスレッドも終了しますか?私はこれについて混乱しています。

次のテストコードを検討してください。

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も終了します。理由を教えてもらえますか?

21
laifjei

メインスレッドが戻る(つまり、main関数から戻る)と、プロセス全体が終了します。これには他のすべてのスレッドが含まれます。 exitを呼び出すと、同じことが起こります。これを回避するには、pthread_exitを呼び出します。

pthread_detachの目的は、リソースを解放するために他のスレッドと結合する必要がないようにすることです。スレッドを切り離しても、プロセスの終了後は存在しません。他のすべてのスレッドと一緒に破棄されます。

16
Dietrich Epp

新しいスレッドのそれぞれで pthread_join() を使用して、呼び出し側のスレッドにサブスレッドで待機し、実行を停止してプロセスを終了するよう通知して、それらのスレッドが終了するまで待ちます。

作成されたスレッドで pthread_detach を呼び出してもプロセスが終了した後も保持されません。 Linuxから man page

Detached属性は、スレッドが終了したときのシステムの動作を決定するだけです。プロセスがexit(3)を使用して終了した場合(または、メインスレッドが戻った場合)にスレッドが終了することを妨げません。

pthread_exitmainに明示的にpthread_join呼び出しの代わりに使用されることがあります。この目的は、このようにmainを終了することです。他のスレッドが実行を継続できるようにします。実際、 linux man page はこれを明示的に述べています:

他のスレッドが実行を継続できるようにするには、メインスレッドは、exit(3)ではなくpthread_exit()を呼び出して終了する必要があります。

しかし、これがすべてのプラットフォームで予想される動作であるかどうかはわかりません。また、常にpthread_joinを使用することにこだわっています。

pthread_joinにはターゲットスレッドのpthread_tが必要です。したがって、pthread_joinを呼び出して両方を待機する前に両方のスレッドを作成する必要があるため、コードを少し変更する必要があります。したがって、startThreadで呼び出すことはできません。 pthread_tを返すか、pthread_tへのポインターをstartThread関数に渡す必要があります。

26
pb2q