Problem:
Ein einfaches Multithreading-Programm verhält sich unerwartet, wenn es im optimierten Modus kompiliert wird. Während das Programm normal im Debug-Modus oder mit -O0 läuft, bleibt es hängen, wenn es mit -O1, -O2 oder -O3 kompiliert wird.
Lösung:
Die Das Problem liegt im nicht-atomaren Zugriff auf die fertige Variable. In einer Multithread-Umgebung kann der Zugriff zweier Threads auf eine nicht geschützte, nicht atomare Variable zu undefiniertem Verhalten führen. Um dies zu beheben, sollte die fertige Variable atomar gemacht werden.
Fix:
#include <iostream> #include <future> #include <atomic> static std::atomic<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::endl; std::cout << "\nmain thread>
Erklärung:
Von Mit std::atomic
Zusätzliche Hinweise:
Das obige ist der detaillierte Inhalt vonWarum bleibt mein Multithread-Programm hängen, wenn es mit Optimierung kompiliert wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!