Ich verstehe nicht, warum dieses einfache Snippet eine dead lock hat:
%Vor%Bearbeiten Ich habe den Contursor-Satz mExit = true
falsch eingegebenBearbeiten 2 Ich verwende msvc2012 mit v110_xp toolset.
Bearbeiten 3 Das Problem verschwindet, wenn ich gTest.release () explizit innerhalb von main
aufrufen werdeIch habe gerade dieses Problem, also poste ich die wirkliche Antwort für andere.
In Visual Studio gibt es zumindest eine "Exit-Sperre", die gesperrt wird, wenn ein Thread in den Exit-Code eintritt (zB nach main()
für den Haupt-Thread und nach f()
für std::thread(f)
).
Da Ihre Testklasse erst nach dem Abschluss von main()
zerstört wird, ist die "exit lock" gesperrt. Nur dann setzen Sie mExit = true;
und der andere Thread darf abschließen. Dieser andere Thread wartet dann auf die "Exit-Sperre", die bereits vom Hauptthread ausgeführt wird, während der Hauptthread in mThread.join();
wartet, was zum Deadlock führt.
Sie müssen also allen Ihren Threads beitreten, bevor der Hauptthread abgeschlossen ist.
Für mich sieht der Code in Ordnung aus, wenn es in Ordnung ist mit Local Duty schlecht bei Global Ich würde vermuten, dass Klasse mit Deinit-Sequenz zusammenhängt. Der Join findet beim Exit tief statt und die Implementierung könnte bereits einige Strukturen beseitigt haben. Es sollte nicht so sein, aber möglich.
Ich vermeide es auf jeden Fall, den Thread vor dem main zu starten und das Ende des mains zu verlassen. Ich halte das nur für Ärger. Wenn Sie es neu anordnen können, um die Verbindung zu einem früheren Zeitpunkt zu erzwingen, kann das ganze Problem verschwinden.
Auch sollten Sie wahrscheinlich atomic_flag über atomare verwenden.
Code von
änderngTest = TestPtr (neuer Test);
bis
auto gTest = std :: make_unique ();
Beseitigen Sie das Problem.
das Problem als Punkt oben mit globalem Objekt.
Tags und Links c++ multithreading