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:
Arbeiter überprüfen ein Stoppflag:
while (!stop.load(std::memory_order_relaxed)) { // Perform tasks }
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:
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!