Heim > Backend-Entwicklung > C++ > Warum bleibt mein Multithread-Programm im optimierten Modus stehen, funktioniert aber im -O0?

Warum bleibt mein Multithread-Programm im optimierten Modus stehen, funktioniert aber im -O0?

Patricia Arquette
Freigeben: 2024-12-29 22:02:30
Original
651 Leute haben es durchsucht

Why Does My Multithreaded Program Stall in Optimized Mode But Work in -O0?

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 deklariert werden. Dieser Typ bietet atomare Lese- und Schreibvorgänge und stellt sicher, dass gleichzeitige Zugriffe auf die Variable klar definiert und konsistent bleiben.

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>
Nach dem Login kopieren

Live-Demo: coliru

Zusätzliche Überlegungen:

  • Flüchtige Variablen allein können keine Atomizität garantieren. Während sie den Compiler daran hindern, Lese-/Schreibvorgänge zu optimieren, stellen sie keine Speicherbarrieren oder Synchronisierungsprimitive bereit.
  • Moderne Compiler gehen bei der Optimierung sehr aggressiv vor. Es ist wichtig, explizit gemeinsam genutzte Speicherbereiche und Ressourcensynchronisierungsanforderungen anzugeben, um unerwartetes Verhalten zu verhindern.

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage