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.
pthread_join
macht zwei Dinge:
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.
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,
Wenn Sie möchten, dass alle Threads abgeschlossen werden, bevor das Programm beendet wird, funktioniert dies durch Verbinden mit dem Hauptthread.
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.
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.
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()
.
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.
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.
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?
Tags und Links c multithreading pthreads