2016-06-16 11 views
1

Ich bin relativ neu bei POSIX-Thread-Implementierungen und ich habe ein Eckfallverhalten, über das ich mir nicht sicher bin.pthread_detach Verhalten, wenn es einen Tischler gibt

Nach meinem Verständnis kann man pthread_deatch() auf einem Join-fähigen PThread aufrufen, um es abzutrennen.

Nachdem ein Thread getrennt wurde, muss er nicht darauf warten, dass sich jemand anmeldet, damit seine Ressourcen vom System freigegeben werden.

Meine Frage ist, was ist, wenn ein Join-fähigen Thread (nennen wir es Thread B) durch einen Thread (nennen wir es einen Thread A) nach Thread B erstellt wurde. Nehmen wir außerdem an, dass Thread B gerade ausgeführt wurde, als Thread A verbunden wurde, wodurch Thread A angehalten wurde, bis Thread B die Ausführung beendet hatte. Inzwischen Thread C aufgerufen pthread_deatch() auf Thread B.

In einem solchen Szenario, was mit Thread A, die im schwebenden Zustand auf Thread B warten soll, um zu beenden. Wird Thread B die Ausführung fortsetzen und dann Thread A geweckt, um den Rückgabewert von B zu erhalten? Oder wird Thread A geweckt, sobald Thread B als losgelöst markiert wird?

Antwort

2

Die POSIX description for pthread_join() sagt:

Das Verhalten ist nicht definiert, wenn der Wert durch das Argument thread-pthread_join() angegeben wurde, nicht auf einen joinable Thread verweisen.

Wenn Sie pthread_deatch() auf dem Faden rufen in einem anderen Thread verbunden ist, dann ist der Faden nicht mehr joinable, so das Verhalten von pthread_join() wird nicht definiert.

Mit anderen Worten, das ist nicht erlaubt.

Wenn Sie feststellen, dass Sie den Beitritts-Thread "früh" aufwecken müssen, können Sie entweder die Thread-Annullierung verwenden (pthread_join() ist ein Abbruchspunkt) oder eine Zustandsvariable einrichten, die auf statt auf pthread_join() wartet.