Multithreading-Programm bleibt im optimierten Modus stehen, läuft aber normal in -O0
Dieses Problem tritt bei einem Multithreading-Programm auf, bei dem gemeinsam genutzte Variablen nicht atomar sind. Konkret liegt das Problem darin, dass die boolesche Variable fertig ist, auf die zwei Threads ohne Synchronisierung oder Atomizität zugreifen.
Im optimierten Modus geht der Compiler davon aus, dass gemeinsam genutzte Variablen, auf die mehrere Threads zugreifen, geschützt sind. In diesem Programm wird „finished“ jedoch als regulärer Bool deklariert und ist somit nicht atomar. Dadurch kann der Compiler die Synchronisationsmechanismen optimieren, die für den Multithread-Betrieb unerlässlich sind.
Um dieses Problem zu beheben, sollte „finished“ als std::atomic
Fester Code:
#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::cout << "\nmain thread>
Live-Demo: coliru
Zusätzliche Überlegungen:
Das obige ist der detaillierte Inhalt vonWarum bleibt mein Multithread-Programm im optimierten Modus stehen, funktioniert aber im -O0?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!