2012-08-09 9 views
15

私は同じプロセスでメインスレッドと他のスレッドについて問題があります。メイン関数が戻ると、もう一方のスレッドも終了しますか?私はいくつか私を混乱させる。そして、私はこのようなテストコードを書いています:メインスレッド出口、他の出口もありますか?

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も終了、誰も私に教えてくれる?

+0

質問の本文が質問の本文と一致しません。メインスレッドが終了したときに何が起きるのでしょうか?あるいは、メインスレッドが 'main'関数から復帰したときに何が起きるのでしょうか? (明らかに、スレッドが終了した場合、スレッドはそれを返すことはできません)。 –

答えて

9

メインスレッドが戻ると、プロセス全体が終了します。これには他のすべてのスレッドが含まれます。 exitに電話すると同じことが起こります。

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

+16

この回答は書かれている通りではありません。メインスレッド(または任意のスレッド)が 'exit'を呼び出すとき、または' main'の最初の呼び出しが戻るとき、プロセス全体が終了します。しかし、メインスレッドは他のスレッドに影響を与えずに 'pthread_exit'で終了することができます。 –

19

新しいスレッドのそれぞれにpthread_join()を使用して、サブスレッドを待機し、実行を中断して終了を処理し、それらのスレッドが終了するまで待機するようにします。

作成されたスレッドpthread_detachをコールすると、処理が終了した後にそれらが保持されません。 linuxからman page

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

あなたは時々意図がこのようにmainを終了すると、他のスレッドが実行を継続できるようになるということで、mainpthread_exitが明示的にpthread_join呼び出しの代わりに使用され表示されます。実際には、linux man page状態は、明示的にこの:

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

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

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

+1

しかし、これを避けるためにpthread_detach関数を使用します。 – laifjei

+2

['pthread_detach'](http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_detach.html)のドキュメントをよく読んでください。あなたが考えるようなことはしません。 – pb2q

+0

@laifjeiあなたは、提供されている機能でデタッチを間違えているかもしれません。 g。 Java/C#/ Python/etcにあります。 - デーモンスレッド。 Javaでは、デーモンではないスレッドが生き残っている間に(たとえメインスレッドがなくなっても)、プロセスが生き残ります。 –

関連する問題