Heim >Backend-Entwicklung >C++ >Warum bleibt mein Multithread-Programm hängen, wenn es mit Optimierung kompiliert wird?

Warum bleibt mein Multithread-Programm hängen, wenn es mit Optimierung kompiliert wird?

Linda Hamilton
Linda HamiltonOriginal
2024-12-19 08:24:56941Durchsuche

Why Does My Multithreaded Program Hang When Compiled with Optimization?

Multithreading-Programm bleibt im optimierten Modus hängen

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 stellen wir sicher, dass auf die fertige Variable auf atomare Weise zugegriffen und diese geändert wird, wodurch Race Conditions verhindert werden undefiniertes Verhalten.

Zusätzliche Hinweise:

  • Die Verwendung von volatile für diesen Zweck wird nicht empfohlen, da die erforderliche Synchronisierung nicht gewährleistet ist.
  • Der Compiler kann die Ausführung von Code optimieren, einschließlich variabler Zugriffsmuster. Es ist wichtig, geeignete Synchronisierungsprimitive zu verwenden, um das korrekte Programmverhalten sicherzustellen.

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!

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