Heim >Backend-Entwicklung >C++ >Warum „memory_order_seq_cst' zum Setzen eines Stoppflags verwenden, das mit „memory_order_relaxed' überprüft wird?

Warum „memory_order_seq_cst' zum Setzen eines Stoppflags verwenden, das mit „memory_order_relaxed' überprüft wird?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-15 03:10:021027Durchsuche

Why Use `memory_order_seq_cst` for Setting a Stop Flag Checked with `memory_order_relaxed`?

Warum sollte man „memory_order_seq_cst“ zum Setzen des Stop-Flags verwenden, wenn es mit „memory_order_relaxed“ aktiviert ist?

Herb Sutter stellt in seiner Präsentation „Atomwaffen“ vor Verwendung atomarer Variablen, einschließlich eines Szenarios Beteiligt an:

  • Hauptthread erzeugt Arbeitsthreads
  • Arbeiter überprüfen ein Stoppflag:

    while (!stop.load(std::memory_order_relaxed))
    {
      // Perform tasks
    }
  • Der Hauptthread setzt den Stopp schließlich auf „true“. using memory_order_seq_cst.

Sutter behauptet, dass using „memory_order_relaxed“ zur Überprüfung des Flags ist akzeptabel, da es nur minimale Auswirkungen auf die Thread-Stoppverzögerung hat. Der Grund für die Verwendung von „memory_order_seq_cst“ zum Setzen des Stopp-Flags bleibt jedoch unklar.

Analyse:

mo_relaxed ist sowohl zum Laden als auch zum Speichern des Stopp-Flags ausreichend:

Es gibt keinen signifikanten Latenzvorteil bei der Verwendung stärkerer Speicherordnungen, selbst wenn Die Latenz beim Beobachten von Änderungen in Stop- oder Keep_Running-Flags ist entscheidend.

Es ist unklar, warum Sutter von einem entspannten Ladenbetrieb abrät. Der ISO-C-Standard spezifiziert jedoch nicht den Zeitpunkt der Ladensichtbarkeit oder Faktoren, die ihn beeinflussen. Implementierungen sind nur vorgeschrieben, um die Sichtbarkeit innerhalb eines endlichen Zeitraums sicherzustellen.

Inter-Thread-Latenz und Implementierung:

Inter-Thread-Latenz wird in erster Linie durch die Implementierung bestimmt. Reale C-Implementierungen nutzen Hardware-Cache-Kohärenzmechanismen, was typischerweise zu einer geringen Latenz (zig Nanosekunden) für die Speichertransparenz führt.

Weder seq_cst noch entspannte Speicherreihenfolgen beschleunigen die Speichertransparenz; Sie steuern lediglich das Verhalten nachfolgender Vorgänge in Bezug auf den Speicher oder die Ladung. Stärkere Befehle beschleunigen Ereignisse nicht, sondern verzögern andere Vorgänge, bis die angegebene Reihenfolge eingehalten wird.

Entspannte Sichtbarkeit und Hardware-Cache-Kohärenz:

Auf echter Hardware mit Cache-Kohärenz, Speicher Bestellungen verbessern nicht die zeitliche Sichtbarkeit des Geschäfts; Sie verwalten lediglich die Fähigkeit nachfolgender Vorgänge, vor der Speicherverpflichtung global sichtbar zu werden.

Vorteile der entspannten Speicherreihenfolge für Stop Flag:

Die Hauptvorteile der entspannten Speicherreihenfolge zur Überprüfung des Stopp-Flags sind:

  • Erhöhte Parallelität über Schleifeniterationen hinweg, wenn das Ladeergebnis ist falsch.
  • Vermeidung unnötiger Befehlsausführung, insbesondere auf ISAs, bei denen Acquire- oder seq_cst-Ladevorgänge zusätzliche Anweisungen erfordern (z. B. ARMv7 dmb ish).

Schlussfolgerung:

In diesem Szenario eignet sich „memory_order_relaxed“ sowohl zum Laden als auch zum Speichern des Stopp-Flags. „memory_order_seq_cst“ ist nicht erforderlich, um das Timing der Store-Sichtbarkeit zu verbessern. Stattdessen wird es verwendet, um die gewünschte Reihenfolge nachfolgender Vorgänge durchzusetzen und Probleme mit gleichzeitigen Schreibvorgängen zu vermeiden.

Das obige ist der detaillierte Inhalt vonWarum „memory_order_seq_cst' zum Setzen eines Stoppflags verwenden, das mit „memory_order_relaxed' überprüft 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