Was unterscheidet sich zwischen join()
und detach()
im Multi-Threading in C++? Tut join()
den Thread töten?
Was ist der Unterschied zwischen join() und disconnect() für Multi-Threading in C++?
r.hg
Michael Burr
Ein C++ thread
Das Objekt stellt im Allgemeinen (aber nicht immer) einen Ausführungsthread dar, der ein Betriebssystem- oder Plattformkonzept ist.
Wann thread::join()
aufgerufen wird, blockiert der aufrufende Thread, bis der Ausführungs-Thread abgeschlossen ist. Grundsätzlich ist dies ein Mechanismus, der verwendet werden kann, um zu wissen, wann ein Thread beendet ist. Wann thread::join()
zurückgibt, ist der Ausführungsthread des Betriebssystems abgeschlossen und C++ thread
Objekt zerstört werden kann.
Das thread::detach()
aufgerufen wird, wird der Thread der Ausführung von dem “abgetrennt”. thread
Objekt und wird nicht mehr durch a dargestellt thread
Objekt – sie sind zwei unabhängige Dinge. Das C++ thread
Objekt kann zerstört werden und der Ausführungs-Thread des Betriebssystems kann weitergehen. Wenn das Programm wissen muss, wann dieser Ausführungs-Thread abgeschlossen ist, muss ein anderer Mechanismus verwendet werden. join()
darauf kann man sich nicht berufen thread
Objekt nicht mehr, da es keinem Ausführungs-Thread mehr zugeordnet ist.
Es wird als Fehler angesehen, ein C++ zu zerstören thread
Objekt, solange es noch “verbindbar” ist. Das heißt, um ein C++ zu zerstören thread
Objekt entweder join()
muss aufgerufen (und abgeschlossen) werden oder detach()
muss angerufen werden. Wenn ein C++ thread
Objekt noch verbindbar ist, wenn es zerstört wird, wird eine Ausnahme ausgelöst.
Einige andere Möglichkeiten, die ein C++ thread
-Objekt stellt keinen Ausführungsthread dar (d. h. kann nicht verbunden werden):
- Ein Standard konstruiert
thread
-Objekt stellt keinen Ausführungsthread dar und kann daher nicht verknüpft werden. - Ein Thread, aus dem verschoben wurde, stellt keinen Ausführungsthread mehr dar und kann daher nicht beigetreten werden.
-
EIN
detach
ed-Thread ist dasselbe wie der Moved-from-Fall, außer dass es kein neues Objekt gibt, das diesen Thread besitzt– Caleth
9. Februar 2021 um 12:46 Uhr
Dmitri Jermolow
join()
tötet den Thread nicht. Tatsächlich wartet es, bis die Hauptfunktion des Threads zurückkehrt. Also, wenn Ihre Thread-Hauptfunktion so aussieht:
while (true) {
}
join()
wird ewig warten.
detatch()
tötet Thread auch nicht. Eigentlich erzählt es std::thread
dass dieser Thread auch weiterhin laufen sollte, wenn std::thread
Objekt wird zerstört. C++ prüft im std::thread-Destruktor, ob der Thread entweder verbunden oder getrennt ist, und beendet das Programm, wenn diese Prüfung fehlschlägt.
Wenn Sie also die erste Zeile auskommentieren main
Funktion des folgenden Codes wird es abstürzen. Wenn Sie die zweite oder dritte Zeile auskommentieren, funktioniert es in Ordnung.
#include <thread>
void func() {
}
void fail1() {
std::thread t(func);
// will fail when we try to destroy t since it is not joined or detached
}
void works1() {
std::thread t(func);
t.join();
}
void works2() {
std::thread t(func);
t.detach();
}
int main() {
// fail1();
// works1();
// works2();
}
Einfach ausgedrückt, beide Methoden starten einen neuen Thread, aber –
after detach() execution main thread continues running
after join() execution main thread pauses and waits until the new thread ends
Genießen!
-
Keiner von beiden startet einen neuen Thread. Thread wird mit gestartet
std::thread
Konstrukteur.– Yksisarvinen
29. März um 0:52