ist es notwendig, pthread_join() aufzurufen

Lesezeit: 5 Minuten

Benutzer-Avatar
nav_jan

Ich erstelle mehr als 100 Threads von meinem main(), also wollte ich nur wissen, was ich anrufen muss pthread_join() bevor ich mein main() verlasse. Außerdem brauche ich die von diesen Threads generierten Daten nicht, im Grunde erledigen alle Threads unabhängig von main() und anderen Threads eine Arbeit.

pthread_join macht zwei Dinge:

  1. Warten Sie, bis der Thread beendet ist.
  2. Bereinigen Sie alle Ressourcen, die dem Thread zugeordnet sind.

Wenn Sie den Prozess verlassen, ohne beizutreten, wird (2) vom Betriebssystem für Sie erledigt (obwohl es keine Bereinigung des Thread-Abbruchs durchführt, sondern nur den Thread aus dem Orbit entfernt), und (1) nicht. Also, ob Sie anrufen müssen pthread_join hängt davon ab, ob (1) passieren muss.

Wenn Sie den Thread nicht zum Laufen benötigen, können Sie ihn, wie alle anderen sagen, auch trennen. Einem getrennten Thread kann nicht beigetreten werden (Sie können also nicht auf seinen Abschluss warten), aber seine Ressourcen werden automatisch freigegeben, wenn er abgeschlossen ist.

  • Vielen Dank für Ihre Antwort Ich brauche main() nicht, um weiter auf den Abschluss aller Threads zu warten. Ich rufe einfach pthread_detach() auf und beende mein main() und schließlich wird das Betriebssystem sicher alle Ressourcen freigeben, die von allen Threads nach ihrer Fertigstellung verwendet werden.

    – nav_jan

    15. Mai 2012 um 12:38 Uhr

  • @ user1271244: nein. Wenn Sie die Threads trennen, werden sie beim Beenden des Prozesses beendet, weshalb ich gesagt habe: “Wenn Sie den Thread nicht zum Ausführen benötigen, können Sie ihn auch trennen”. Wenn es ausgeführt werden soll, müssen Sie ihm beitreten.

    – Steve Jessop

    15. Mai 2012 um 13:58 Uhr

Ja, wenn Thread anfügbar ist, muss pthread_join andernfalls ein Zombie-Thread erstellt werden.

Stimmen Sie den obigen Antworten zu, teilen Sie einfach eine Notiz von der Manpage von pthread_join.

ANMERKUNGEN

   After a successful call to pthread_join(), the caller is guaranteed that the target thread has terminated.

   Joining with a thread that has previously been joined results in undefined behavior.

   Failure to join with a thread that is joinable (i.e., one that is not detached), produces a "zombie thread".  Avoid doing this, since each zombie thread consumes some  system  resources,  and  when
   enough zombie threads have accumulated, it will no longer be possible to create new threads (or processes).

Beim Beenden müssen Sie nicht beitreten, da alle anderen Threads und Ressourcen automatisch bereinigt werden. Dies setzt voraus, dass Sie tatsächlich möchten, dass alle Threads wann beendet werden main Ausgänge.

Wenn Sie einem Thread nicht beitreten müssen, können Sie ihn mithilfe von als “abgelösten” Thread erstellen pthread_attr_setdetachstate auf die Attribute, bevor Sie den Thread erstellen. Getrennte Threads können nicht verbunden werden, aber sie tun es nicht brauchen auch beitreten.

So,

  1. Wenn Sie möchten, dass alle Threads abgeschlossen sind, bevor das Programm beendet ist, funktioniert dies durch das Beitreten aus dem Haupt-Thread.

  2. Alternativ können Sie die Threads als getrennt erstellen und von zurückkehren main nachdem alle Threads beendet wurden, wird die Koordination mithilfe einer Semaphor- oder Mutex+Bedingungsvariablen durchgeführt.

  3. Wenn Sie nicht alle Threads zum Abschließen benötigen, kehren Sie einfach von main zurück. Alle anderen Threads werden zerstört. Sie können die Threads auch als getrennte Threads erstellen, was den Ressourcenverbrauch reduzieren kann.

  • Beachten Sie, dass im Fall (2) Ihre Koordination sicherstellen kann, dass Sie nicht aussteigen, bis die Threads getan haben, was sie tun, bevor sie den Semaphor oder die Condvar posten. Dies sollte für alle praktischen Zwecke ausreichen, stellt aber nicht sicher, dass Sie nicht beenden, bis die Threads beendet wurden, da sie zu einem unbestimmten Zeitpunkt beendet werden, nachdem sie den Code ausgeführt haben, der Ihren Haupt-Thread benachrichtigt, dass etwas Interessantes vorliegt passiert.

    – Steve Jessop

    15. Mai 2012 um 12:16 Uhr


Standardmäßig werden Threads in der pthreads-Bibliothek als verknüpfbar erstellt.

Threads können sich jedoch lösen, wodurch sie nicht mehr verbunden werden können. Da Threads Systemressourcen verbrauchen, bis sie verbunden werden, ebenso wie Prozesse Ressourcen verbrauchen, bis ihre Eltern wait() aufrufen, müssen Threads, denen Sie nicht beitreten möchten, getrennt werden, was eine gute Programmierpraxis ist.

Sobald die Hauptroutine beendet ist, werden natürlich alle Threading-Ressourcen freigegeben.

Wenn wir das nicht tun (Trennen), dann erzeugt der Thread, wenn er beendet wird, das Thread-Äquivalent eines Zombie-Prozesses. Abgesehen von der Verschwendung von Systemressourcen können wir keine zusätzlichen Threads erstellen, wenn sich genügend Thread-Zombies ansammeln.

Benutzer-Avatar
alk

Standardmäßig wird ein Thread verbunden ausgeführt, das heißt, die Ressourcen, die er benötigt, werden verwendet, bis der Thread beigetreten wird.

Wie aus Ihrer Beschreibung hervorgeht, benötigt niemand außer dem Thread selbst die Ressourcen des Threads. Sie können den Thread also getrennt erstellen oder den Thread trennen, bevor Sie ihn starten.

Um einen Thread nach seinem Erstellungsaufruf zu trennen pthread_detach().

Wie auch immer, wenn Sie sicherstellen wollen, dass alle Threads weg sind, bevor das Programm endet, sollten Sie die angehängten Threads ausführen und ihnen beitreten, bevor Sie den Hauptthread (das Programm) verlassen.

Benutzer-Avatar
Didier Trosset

Wenn Sie sicher sein wollen, dass Ihr Thread wirklich fertig ist, wollen Sie anrufen pthread_join.

Wenn Sie dies nicht tun, wird das Beenden Ihres Programms den gesamten unvollendeten Thread abrupt beenden.

Das heißt, Ihr main ausreichend lange warten kann, bis es austritt. Aber wie können Sie dann sicher sein, dass es ausreichend ist?

Benutzer-Avatar
fbernardo

Wenn Ihr Main endet, endet Ihre Anwendung und Ihre Threads sterben … Sie müssen also Thread Join verwenden (oder stattdessen Fork verwenden).

1283210cookie-checkist es notwendig, pthread_join() aufzurufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy