2016-04-22 13 views
2

たとえば、3つのスレッドを作成して同じ順序で結合するとします。 2番目のスレッドが最初に終了すると、pthread_joinはどうなりますか? tid1が終了するか、pthread_join(& tid2、NULL)から直接返されるまで、プログラムはブロックされますか?スレッドが他のスレッドがそれを待つ前に終了する場合(join)?

pthread_t tid1,tid2,tid3; 
    pthread_create(&tid1, NULL, SomeFun, NULL); 
    pthread_create(&tid2, NULL, SomeFun, NULL); 
    pthread_create(&tid3, NULL, SomeFun, NULL); 
    pthread_join(&tid1, NULL); 
    pthread_join(&tid2, NULL); 
    pthread_join(&tid3, NULL); 
+0

'pthread_join()'は恐ろしい "出身"ではありません。 – EOF

答えて

1

。その間にtid2が終了すると、この特定の呼び出しの動作は変更されません。しかし、そのシナリオでは、呼び出しが返さない場合、次の呼び出し:

pthread_join(&tid2, NULL); 

tid2が既に終了しているので、すぐに戻ります。

任意のスレッドが終了したときにすぐに作業を行う場合は、「一部のスレッドが終了しました」というイベントと同期するためにpthread_join()以外のものを使用する必要があります。おそらく、完了時にすべてのスレッドによって(待ち行列のどのスレッドが完了を通知したかを判断できるように、待ち行列などのいくつかのメカニズムとともに)状態変数を待つかもしれません。使用可能な別のメカニズムは、スレッドがメイン(または制御)スレッドがその通知を取得するために読み取る情報をスレッドに書き込ませることです。

1

すでに終了しているスレッドに参加する場合は、pthread_joinはすぐに戻ります(そしてそれが通常行うように、スレッドオブジェクトを破棄します)。

pthread_join(&tid1, NULL); 

tid1がまだ終了していない場合はそれがないまで、その呼び出しはブロックされます:あなたは、コードの呼び出し

+0

それでは、まずpthread_join(&tid1、NULL)を実行してから、すぐにpthread_join(&tid2、NULL)から戻ってtid3を待つのですか? – user5574376

+0

はい.............. – immibis