Der folgende Code stürzt in zufälligen Intervallen ab, wenn er mit MSVC unter Debug
erstellt wird, im Gegensatz zu Release
.Absturz beim Zuweisen zu std :: future unter MSVCs Debug-Modus
#include <future>
using namespace std;
int main() {
auto l = [](){};
auto f = async(launch::async, l);
for (int i = 0; i < 1000000; ++i)
f = async(launch::async, l);
}
Die Konsolenausgabe sagt:
f: \ dd \ vctools \ crt \ crtw32 \ stdcpp \ thr \ mutex.c (51): Mutex zerstört, während beschäftigt
Der vollständige Callstack lautet: https://pastebin.com/0g2ZF5C1
Jetzt ist es offensichtlich nur ein Stresstest, aber mache ich etwas völlig Dummes? Es scheint mir, es ist in Ordnung, eine neue Aufgabe zu einer bestehenden Zukunft neu zuzuweisen, wie es gesagt wird, dass operator=
:
Releases jeder freigegebener Zustand und die Inhalte andere bewegen-zuordnet * this
(Wegen http://en.cppreference.com/w/cpp/thread/future/operator%3D).
Ist es ein Fehler in MSVC Laufzeit?
Bemerkenswert ist, stoppt das Programm abstürzt, wenn ich() vor der Zuweisung manuell Warte aufrufen, damit die Schleife in die Herstellung:
for (int i = 0; i < 1000000; ++i) {
f.wait();
f = async(launch::async, l);
}
Ist das nicht operator=
selbst soll wait
nennen?
Hintergrund:
_MSC_VER
gleich 1911
Code mit Hilfe gebaut wurde:
geöffnetMicrosoft Visual Studio Community 2017 Preview(2)
Version 15.4.0 Preview 2.0
gerade ein brandneues C++ Projekt.
Genaue Version von msvc und Compiler wäre nützlich. – Yakk
Nur eine Vermutung: Manchmal wird 'l' immer noch ausgeführt, während Sie versuchen, f neu zuzuweisen.Wahrscheinlich ist der Overhead beim Erstellen des Lambda im Debug-Modus viel größer im Vergleich zum Overhead der Debug-Version des verbleibenden Codes. Das könnte erklären, dass es nur in der Debug-Version passiert. –
@Yakk Sicher, ich habe die Frage bearbeitet. –