C++11: Was passiert, wenn Sie don ' T call join (), std::thread
Unten angegeben:
void test()
{
std::chrono::seconds dura( 20 );
std::this_thread::sleep_for( dura );
}
int main()
{
std::thread th1(test);
std::chrono::seconds dura( 5 );
std::this_thread::sleep_for( dura );
return 0;
}
main
beendet sich nach 5 Sekunden, was passieren wird th1
das noch ausführen?
Geht es weiter die Ausführung bis zur Fertigstellung, auch wenn die th1
thread-Objekt, das Sie definiert in main
geht aus Umfang und zerstört wird?
Tut th1
setzt sich einfach dort, nachdem es fertig ist die Ausführung oder irgendwie wird aufgeräumt, wenn das Programm beendet wird?
Was ist, wenn der thread erstellt wurde, in eine Funktion, nicht main
- hat der thread bleibt lange herum, bis das Programm beendet wird oder wenn die Funktion den Gültigkeitsbereich verlässt?
Ist es sicher einfach nicht nennen join
für ein thread, wenn Sie wollen, irgendeine Art von timeout-Verhalten auf den thread?
Denn das ist keine zuverlässige Methode des Lernens über garantiert.
weder Fragen auf Stackoverflow ist. Durch das kompilieren und ausführen dieses 5-Linien-exmple, zumindest konnte er eine Spur finden. Es gibt nur eine Quelle von Garantien -- a-standard.
"weder-noch Fragen auf Stackoverflow ist" Nun, eine gute Antwort SO in meiner Stellungnahme zitiert eine zuverlässige Quelle (wie du hast). Nicht einmal der Standard selbst aber ist eine absolut zuverlässige Quelle, da es Mängel aufweist. Compiler-Anbieter werden oft abweichen von einer wörtlichen Auslegung z.B. einbinden von beschlussvorlagen der Mangel berichten. Wegen der Existenz von Undefiniertes Verhalten, ich denke, es ist keine gute Praxis, um zu erfahren, garantiert, indem Sie versuchen, Dinge aus.
Ich denke mir "warum versuchst du es nicht?" ist eine durchaus gültige Antwort, die Frage würde sich verbessern, wenn es zeigte sich der OP die Mühe gemacht hätte zu laufen einige Experimente bevor Sie Fragen. "Ich habe es versucht und mein Programm beendet wird, wird erwartet, dass?" ist eine bessere Frage als "was würde passieren, wenn ich dies getan habe?" Es ist nicht so, wir reden über das Essen ein paar unbekannte Beeren wachsen wild, C++11 Compiler sind frei verfügbar und laufen Experimente ist einfach und lehrreich.
InformationsquelleAutor kiki | 2014-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht abgenommen wird oder sich ein thread, wenn der Destruktor aufgerufen wird, wird es rufen
std::terminate
sehen wir dies, indem Sie auf der draft standard C++11 wir sehen, dass Abschnitt30.3.1.3
thread Destruktor sagt:als für eine Begründung für dieses Verhalten finden wir eine gute Zusammenfassung in (Nicht) verwenden von std::thread
und ein Beispiel folgt und sagt auch:
Die Artikel-Verweise N2802: Ein Plädoyer zum überdenken trennen-auf-Zerstörung für die thread-Objekte welches argument gegen den früheren Vorschlag wurde trennen, die auf Zerstörung aus, wenn je und Sie stellt fest, dass eine der beiden alternativen wäre beitreten könnte zu einem Deadlock führen die andere alternative ist das, was wir heute haben, die ist
std::terminate
auf Zerstörung, wenn je.InformationsquelleAutor Shafik Yaghmour
std::thread::~thread()
Quelle: http://en.cppreference.com/w/cpp/thread/thread/~thread
Dies bedeutet, dass das Programm wie dieses ist nicht bei allen gut-gebildet oder sicher.
Beachten Sie jedoch, dass
boost::thread::~thread()
Anrufedetach()
statt in diesem Fall.(als Benutzer dyp erwähnt in den Kommentaren, dieses Verhalten ist veraltet, die in neueren Versionen)
Konnte man immer umgehen mit RAII. Nur wickeln Sie den Faden in einer anderen Klasse, das gewünschte Verhalten auf Zerstörung.
Cool! Kann ich hinzufügen, dass es in meiner Antwort? 😉
Gut, natürlich. Das ist, warum ich bin, die Kommentare 🙂
InformationsquelleAutor Ivan Aksamentov - Drop
In C++11 ist, müssen Sie explizit angeben, " was passiert, wenn der neu erstellte thread geht out of scope (unsere ist es dtor aufgerufen wird). Manchmal, wenn wir sicher sind, dass der Haupt-thread ist Fort, und unsere threads sind als "pipeline" ist, ist es sicher 'detach ()'; und manchmal, wenn wir warten, für unsere ARBEITER-threads Ihre Operationen, wir 'join ()'.
Als diese sagt, muss der Programmierer sicherstellen, dass der Destruktor wird nie ausgeführt, während der thread noch je.
Geben Sie Ihre multi-threaded-Strategie. In diesem Beispiel
std::terminate()
genannt wird.InformationsquelleAutor mkr