2016-04-22 9 views
2

Zum Beispiel, wenn ich 3 Threads erstellen und sie in der gleichen Reihenfolge verbinden. Wenn der zweite Thread zuerst austritt, dann würde was mit dem pthread_join passieren. Blockiert das Programm, bis tid1 beendet oder direkt von pthread_join (& tid2, NULL) zurückkehrt?Was passiert, wenn der Thread vor einem anderen Thread auf ihn wartet (beitreten)?

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()' ist nicht das gefürchtete "komm her". – EOF

Antwort

1

, wenn Sie Code ruft:

pthread_join(&tid1, NULL); 

wenn tid1 noch nicht verlassen, dann wird der Anruf blockiert, bis es funktioniert. Wenn tid2 in der Zwischenzeit beendet wird, ändert das das Verhalten dieses bestimmten Aufrufs nicht. Aber in diesem Szenario, wenn der Anruf nicht zurückgibt, den nächsten Anruf:

pthread_join(&tid2, NULL); 

kehrt sofort, da die tid2 bereits verlassen hat.

Wenn Sie sofort etwas arbeiten möchten, wenn ein beliebiger Thread beendet ist, müssen Sie etwas anderes als pthread_join() verwenden, um mit dem Ereignis "ein Thread ist fertig" zu synchronisieren. Vielleicht auf eine Zustandsvariable warten, die von jedem Thread signalisiert wird, wenn sie abgeschlossen ist (zusammen mit einem Mechanismus wie einer Warteschlange, so dass der wartende Thread bestimmen kann, welcher Thread die Beendigung signalisiert hat). Ein anderer Mechanismus, der verwendet werden könnte, besteht darin, dass Threads Informationen in eine Pipe schreiben, die der Haupt- (oder Kontroll-) Thread liest, um diese Benachrichtigung zu erhalten.

1

Wenn Sie einen Thread an, die bereits beendet ist, wird pthread_join sofort wieder (und das Thread-Objekt zu zerstören, wie es normalerweise der Fall ist).

+0

Also wird es zuerst pthread_join (& tid1, NULL) ausführen und dann sofort von pthread_join (& tid2, NULL) zurückkehren und weiter auf tid3 warten? – user5574376

+0

Ja .............. – immibis

Verwandte Themen