ist es notwendig, pthread_join () aufzurufen

8

Ich erstelle mehr als 100 threads von meinem main (), also wollte ich nur wissen, dass ich pthread_join () aufrufen muss, bevor ich mein main () verlasse. Auch brauche ich nicht die Daten, die von diesen Threads generiert werden, im Grunde alle Threads machen einen Job unabhängig von main () und anderen Threads.

    
nav_jan 15.05.2012, 12:02
quelle

6 Antworten

17

pthread_join macht zwei Dinge:

  1. Warten Sie, bis der Thread beendet ist.
  2. Bereinige alle mit dem Thread verbundenen Ressourcen.

Wenn Sie den Prozess beenden, ohne beizutreten, wird (2) für Sie vom Betriebssystem ausgeführt (obwohl es keine Thread-Löschungsbereinigung durchführt, sondern nur den Thread aus dem Orbit nuke), und (1) nicht. Ob Sie also pthread_join aufrufen müssen, hängt davon ab, ob Sie (1) benötigen.

Wenn Sie den Thread nicht zum Ausführen benötigen, können Sie ihn, wie alle anderen auch sagen, ebenfalls lösen. Ein gelöschter Thread kann nicht verknüpft werden (Sie können also nicht auf den Abschluss warten), aber seine Ressourcen werden automatisch freigegeben, wenn sie abgeschlossen sind.

    
Steve Jessop 15.05.2012, 12:11
quelle
2

Wenn Sie beenden, müssen Sie nicht mehr teilnehmen, da alle anderen Threads und Ressourcen automatisch bereinigt werden. Dies setzt voraus, dass Sie tatsächlich alle Threads beenden möchten, wenn main beendet wird.

Wenn Sie einem Thread nicht beitreten müssen, können Sie ihn als "gelösten" Thread erstellen, indem Sie vor dem Erstellen des Threads pthread_attr_setdetachstate für die Attribute verwenden. Abgetrennte Threads können nicht verknüpft werden, aber sie müssen nicht zusammengefügt werden.

Also,

  1. Wenn Sie möchten, dass alle Threads abgeschlossen werden, bevor das Programm beendet wird, funktioniert dies durch Verbinden mit dem Hauptthread.

  2. Alternativ können Sie die Threads als distanziert erstellen und nach dem Beenden aller Threads von main zurückkehren, wobei Sie die Verwendung einer Semaphor- oder Mutex + -Konditionsvariablen koordinieren.

  3. Wenn Sie nicht alle Threads 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, wodurch der Ressourcenverbrauch reduziert werden kann.

Dietrich Epp 15.05.2012 12:05
quelle
1

Standardmäßig wird ein Thread als angehängt ausgeführt, dh die benötigten Ressourcen werden so lange verwendet, bis der Thread verbunden wird.

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

Um einen Thread nach seiner Erstellung zu trennen, rufen Sie pthread_detach() .

auf

Jedenfalls, wenn Sie sicherstellen möchten, dass alle Threads vor dem Programmende verschwunden sind, sollten Sie die angehängten Threads ausführen und sie verbinden, bevor Sie den Hauptthread (das Programm) verlassen.

    
alk 15.05.2012 12:07
quelle
0

Standardmäßig werden Threads in der pthreads-Bibliothek als verbindbar erstellt.

Threads können sich jedoch ablösen, wodurch sie nicht mehr verbunden werden können. Da Threads Systemressourcen verbrauchen, bis sie hinzugefügt werden, müssen Prozesse, die Ressourcen verbrauchen, bis ihre übergeordneten Aufrufe warten (), Threads, die Sie nicht verbinden möchten, getrennt werden, was eine gute Programmierpraxis darstellt.

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

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

    
Gowtham Munukutla 08.10.2017 17:01
quelle
-1

Wenn Ihre Hauptanwendung endet, endet Ihre Anwendung und Ihre Threads sterben ... Sie müssen also Thread-Join verwenden (oder stattdessen fork verwenden).

    
fbernardo 15.05.2012 12:03
quelle
-1

Wenn Sie sichergehen wollen, dass Ihr Thread tatsächlich beendet wurde, möchten Sie pthread_join aufrufen.

Wenn Sie dies nicht tun, beendet das Beenden des Programms den gesamten unfertigen Thread abrupt.

Das heißt, Ihr main kann eine ausreichend lange Zeit warten, bis es beendet wird. Aber wie können Sie dann sicher sein, dass es ausreicht?

    
Didier Trosset 15.05.2012 12:05
quelle

Tags und Links