Was ist der Unterschied zwischen join() und disconnect() für Multi-Threading in C++?

Lesezeit: 3 Minuten

Benutzer-Avatar
r.hg

Was unterscheidet sich zwischen join() und detach() im Multi-Threading in C++? Tut join() den Thread töten?

Benutzer-Avatar
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 detached-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

Benutzer-Avatar
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

von Microsoft-Dokumentation

Genießen!

  • Keiner von beiden startet einen neuen Thread. Thread wird mit gestartet std::thread Konstrukteur.

    – Yksisarvinen

    29. März um 0:52

1012350cookie-checkWas ist der Unterschied zwischen join() und disconnect() für Multi-Threading in C++?

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

Privacy policy