std :: thread.join () Deadlock

8

Ich verstehe nicht, warum dieses einfache Snippet eine dead lock hat:

%Vor%

Bearbeiten Ich habe den Contursor-Satz mExit = true

falsch eingegeben

Bearbeiten 2 Ich verwende msvc2012 mit v110_xp toolset.

Bearbeiten 3 Das Problem verschwindet, wenn ich gTest.release () explizit innerhalb von main

aufrufen werde     
elvis.dukaj 19.06.2013, 13:01
quelle

3 Antworten

6

Ich 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.

    
god 26.05.2015, 13:33
quelle
3

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.

    
Balog Pal 19.06.2013 13:39
quelle
0

Code von

ändern

gTest = TestPtr (neuer Test);

bis

auto gTest = std :: make_unique ();

Beseitigen Sie das Problem.

das Problem als Punkt oben mit globalem Objekt.

    
Alexei Valyaev 04.06.2017 00:12
quelle

Tags und Links