Volatile Variablen in C 11
Die Einführung eines Multithread-Maschinenmodells im C 11-Standard wirft Fragen zum Verhalten von Volatile auf Variablen, die traditionell verwendet wurden, um eine Optimierung zu verhindern, die zu undefiniertem Verhalten in gleichzeitigen Umgebungen führen könnte.
In C 98/03 bedeutete die fehlende Erkennung von Multithreading im Speichermodell, dass der Compiler das Lesen einer flüchtigen Variablen optimieren konnte, was zu dem berüchtigten Beispiel einer endlosen While-Schleife führte, die darauf wartete, dass eine Variable ihren Wert änderte.
Das C 11-Speichermodell erkennt jedoch die Möglichkeit des gleichzeitigen Zugriffs auf Variablen an. Bedeutet das, dass Volatilität jetzt veraltet ist?
Compiler-Optimierungen und undefiniertes Verhalten
Die Antwort liegt in der nuancierten Natur des C 11-Speichermodells. Es erkennt zwar Multithreading, schließt jedoch nicht die Möglichkeit eines undefinierten Verhaltens beim Zugriff auf Variablen ohne ordnungsgemäße Synchronisierung aus. Selbst in einer Multithread-Umgebung bleibt der nicht-atomare Zugriff auf gemeinsam genutzte Variablen undefiniert.
volatile int x;
void func() {
x = 0;
while (x = = 0) {}
}
Daher steht es dem Compiler in unserem Beispielcode immer noch frei, das Lesen von x in der while-Schleife wegzuoptimieren, was zu undefiniertem Verhalten führt. Volatile betrifft nur Speicherzugriffe, nicht das Threading-Verhalten.
Speicherbarrieren und Threading-Integrität
Threading-Integrität erfordert geeignete Synchronisierungsmechanismen, um die Sichtbarkeit von Schreibvorgängen in einem Thread für einen anderen sicherzustellen . Das C 11-Speichermodell definiert speziell, wann und wie Schreibvorgänge für andere Threads sichtbar werden. volatile erfüllt diese Anforderung nicht.
volatile garantiert, dass der Compiler Speicherlesevorgänge aus einer Variablen nicht optimieren kann, bietet jedoch keine Garantien für die Thread-Sichtbarkeit. Speicherbarrieren, die durch Synchronisationskonstrukte wie Sperren oder atomare Operationen verursacht werden, sind notwendig, um sicherzustellen, dass Schreibvorgänge zwischen Kernen synchronisiert werden.
Schlussfolgerungen
In C 11 bleibt flüchtig relevant um Optimierungen zu verhindern, die zu fehlerhaften Speicherzugriffen führen könnten. Für die Multithread-Programmierung reicht es jedoch nicht aus. Es sind weiterhin geeignete Synchronisierungsmechanismen erforderlich, um Thread-Integrität und definiertes Verhalten in gleichzeitigen Umgebungen zu gewährleisten.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3