Heim >Backend-Entwicklung >C++ >Warum bleibt mein optimiertes Multithread-Programm stehen und wie können atomare Variablen das Problem beheben?

Warum bleibt mein optimiertes Multithread-Programm stehen und wie können atomare Variablen das Problem beheben?

Barbara Streisand
Barbara StreisandOriginal
2024-12-16 02:01:09502Durchsuche

Why Does My Optimized Multithreaded Program Stall, and How Can Atomic Variables Fix It?

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:

static std::atomic<bool> finished = false;

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:

result = 1023045342
main thread>

Bedeutung von std::atomic

Atomvariablen, B. std::atomic, gewährleisten den gleichzeitigen Zugriff auf und die Änderung gemeinsamer Daten auf wohldefinierte und threadsichere Weise. Sie verhindern unerwartetes Verhalten wie Tearing und schützen vor Compiler-Optimierungen, die den korrekten Programmablauf unbeabsichtigt verändern können.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn