Ich habe eine vector
von thread
s in meinem C++ - Programm.Entfernen Sie Thread aus Vektor nach Thread-Abschluss
std::vector<std::thread> threadList;
I schaffen dann ein Gewinde und schieben es in die vector
.
threadList.push_back(std::thread([]() { ... }));
Wie kann ich die thread
vom threadList
vector
wenn die lambda function beendet Ausführung entfernen?
bearbeiten
ich mit ein wenig von einer Lösung zu kommen haben; Bevor der Thread lambda function zurückkehrt, iteriert er durch vector
, um eine Übereinstimmung in ID mit this_thread::get_id()
zu finden.
Durch Visual Studio Debuggen Zeile für Zeile, ich sehe, dass es eine Übereinstimmung in ID findet und die erase Funktion ausgeführt wird, aber sobald threadList.erase(threadList.begin() + index);
ausgeführt wird, ich komme eine nicht behandelte Ausnahme accross am Deconstructor Funktion Thread.
Ich habe ein kleines Stück Code geschrieben, der diesen Fehler repliziert.
vector<thread> threadList;
threadList.push_back(thread([]() {
Sleep(1000);
threadList.erase(threadList.begin());
}));
Sleep(2000);
//for_each(threadList.begin(), threadList.end(), mem_fn(&thread::detach));
//threadList.clear();
Dieser Code ergibt den folgenden Screenshot.
Das Lambda kann den 'std :: thread' aus dem Vektor entfernen (was bedeutet, dass der' Vektor' vor dem gleichzeitigen Zugriff geschützt wird, zB mit einem 'std :: mutex'), bevor er beendet wird. Oder Sie können das Lambdasignal den Thread, der den 'vector' besitzt, signalisieren lassen und diesen Thread den' std :: thread' entfernen lassen, wenn es Zeit dafür hat. Oder Sie können den besitzenden Thread (oder einen anderen Überwachungsthread) einfach 'join()' den 'std :: thread' haben und ihn entfernen, wenn er fertig ist. –
'Join()' den Thread zuerst, dann entfernen Sie es aus dem Vektor in genau, 100% identische Weise würden Sie etwas von einem anderen Vektor entfernen. Ein Vektor verhält sich nicht anders, wenn er Werte hinzufügt oder entfernt, nur weil er 'std :: threads' enthält. –
std :: vector :: erase() – Les