Volatil in C 11: Abwertung oder Anpassung?
Im C 11-Standard ist der Übergang von einem Single-Threaded zu einem Multi-Threaded Das Threaded-Maschinenmodell wirft die Frage auf: Wird das häufige Beispiel des optimierten Auslesens in C 98/03 in C 11 immer noch ein Problem sein?
Überlegungen zu Single-Threaded vs. Multi-Threaded
Das C 98/03-Speichermodell ging von einer Single-Threaded-Umgebung aus und ignorierte die Möglichkeit des gleichzeitigen Zugriffs auf Variablen. Daher könnten Compiler das Auslesen von Variablen optimieren, die als „static int x;“ gekennzeichnet sind, wie im Beispielcode zu sehen ist.
C 11 führt jedoch ein Multithread-Speichermodell ein und erkennt damit die Möglichkeit eines gleichzeitigen Variablenzugriffs an . Dieses Modell berücksichtigt oder verhindert jedoch nicht explizit das optimierte Ausleseverhalten.
Volatile: Definition des Geltungsbereichs
Volatile ist ein in C 98 hinzugefügtes Schlüsselwort zur Adressierung Optimierungen des Hardware-Speicherzugriffs. Es weist den Compiler an, dass sich eine Variable extern ändern kann und nicht wegoptimiert werden sollte.
Im Kontext des Multithread-Modells von C 11 hat volatile keinen direkten Einfluss auf das Threading-Verhalten. Es stellt lediglich sicher, dass Speicherlesevorgänge aus der Variablen nicht wegoptimiert werden. Dies garantiert jedoch keine sichtbaren Änderungen von einem anderen Thread.
Speicherintegrität und Atomizität
Das Speichermodell von C 11 konzentriert sich auf die Speicherintegrität und nicht auf das Threading-Verhalten. Nicht-atomarer Zugriff auf Variablen (ausgenommen std::atomics und Mutexe) führt zu undefiniertem Verhalten. Selbst bei flüchtigem Verhalten tritt immer noch undefiniertes Verhalten auf, wenn ein anderer Thread die Variable ohne ordnungsgemäße Synchronisierung ändert.
Synchronisations- und Speicherbarrieren
Für Multithread-Kommunikation stellt C 11 spezifische Sprachkonstrukte bereit die Gedächtnisbarrieren hervorrufen. Diese Barrieren erzwingen die Datensynchronisierung zwischen verschiedenen Kernen und gewährleisten die Sichtbarkeit von Datenschreibvorgängen über Threads hinweg. Volatile bietet diese Funktionalität nicht.
Schlussfolgerung
In C 11 besteht das Problem des optimierten Auslesens weiterhin für nicht-atomare Zugriffe. Threading-Überlegungen bleiben von entscheidender Bedeutung, und geeignete Synchronisierungsmechanismen mithilfe von Mutexes oder std::atomics stellen ein definiertes Verhalten sicher. Obwohl „volatile“ Speicherleseoptimierungen verhindern kann, werden Threading-Probleme nicht behoben und keine sichtbaren Datenänderungen über Threads hinweg garantiert.
Das obige ist der detaillierte Inhalt vonIst „flüchtig' in der Multithread-Welt von C 11 immer noch relevant?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!