Optimiertes Multithreading-Programm im optimierten Modus blockiert: Auflösung durch atomare Variablen
Betrachten Sie das folgende Multithreading-Programm:
static bool finished = false; int func() { size_t i = 0; while (!finished) { ++i; } return i; } int main() { auto result = std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished = true; std::cout << "result = " << result.get(); std::cout << "\nmain thread>
Dieses Programm funktioniert wie erwartet im Debug-Modus oder mit dem Optimierungsflag -O0. Bei der Ausführung im Release-Modus oder mit den Optimierungsflags -O1, -O2 oder -O3 tritt jedoch ein Problem auf und es wird keine Ausgabe bereitgestellt.
Ursache und Lösung
Die Ursache des Problems liegt im gleichzeitigen Zugriff auf die nicht-atomare und unbewachte Variable, der durch mehrere Threads erfolgt. Diese Variable garantiert keine Atomizität, was zu undefiniertem Verhalten führt. Um dies zu beheben, sollte „finished“ als std::atomic definiert werden. Dadurch wird das Problem behoben und das Programm kann erfolgreich im optimierten Modus ausgeführt werden und zeigt die gewünschte Ausgabe an: Bedeutung von std::atomic Atomvariablen, B. std::atomic Zusätzliche Überlegungen Während die Verwendung atomarer Variablen die Parallelitätssicherheit erheblich verbessert, Es ist wichtig zu wissen, dass Optimierungen weitreichende Folgen haben können. Beispielsweise könnten Compiler ungeschützte Variablen in Register optimieren oder redundante Zugriffe eliminieren, um die Leistung zu verbessern. Um unbeabsichtigte Optimierungen zu verhindern, sind ein ordnungsgemäßer Variablenschutz und explizite Anweisungen an den Compiler von entscheidender Bedeutung. Das obige ist der detaillierte Inhalt vonWarum bleibt mein optimiertes Multithread-Programm stehen und wie können atomare Variablen das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!static std::atomic<bool> finished = false;
result = 1023045342
main thread>