Vom documentation:Does MS-spezifischer flüchtige verhindern Hardware Anweisungen Neuordnungs
Microsoft Specific
Wenn die/volatilen: ms-Compiler-Option wird verwendet-standardmäßig, wenn andere Architekturen ARM sind targeted - der Compiler generiert zusätzlichen Code, um die Reihenfolge unter Verweisen auf flüchtige Objekte in zusätzlich zur Aufrechterhaltung der Reihenfolge zu Referenzen auf andere globale Objekte zu pflegen.Insbesondere:
Ein Schreiben in ein flüchtiges Objekt (auch als flüchtiges Schreiben bekannt) hat Semantik zum Freigeben; Das heißt, ein Verweis auf ein globales oder statisches Objekt
, das auftritt, bevor ein Schreibvorgang in ein flüchtiges Objekt in der Anweisung Sequenz vor dem flüchtigen Schreibvorgang in der kompilierten
Binärdatei erfolgt.Ein Lesevorgang eines flüchtigen Objekts (auch bekannt als flüchtiger Lesevorgang) hat die Semantik Acquire; das heißt, eine Referenz auf ein globales oder statisches Objekt
, das auftritt, nachdem ein Lesen des flüchtigen Speichers in der Anweisung
Sequenz nach dem flüchtigen Lesen in der kompilierten Binärdatei erfolgt.Dadurch können flüchtige Objekte für Speichersperren und Freigaben in Multithread-Anwendungen verwendet werden.
Es garantiert sicher, dass volatile
Compiler verhindert Kompilierung-Anweisungen tun Neuordnen (weil es ausdrücklich, dass die Anweisung Sequenz wird die gleiche in der kompilierten binären sein).
Aber wie wir alle wissen, gibt es auch so etwas wie Hardware-Neuordnung (wie CPU in der Lage, Anweisungen auf eigene Faust neu zu ordnen). Verhindert das volatile
es auch? Ich weiß, dass Synchronisationsgrundelemente (wie Mutexe) tun, aber was ist mit MS-spezifischen volatile
?
Mit "anderen Architekturen als ARM" bedeutet MS wahrscheinlich x86 und x64. Auf x86 und x64 werden Lasten nicht mit anderen Lasten neu angeordnet. Und Geschäfte werden nicht mit anderen Geschäften bestellt. (mit einigen Ausnahmen wie nicht-temporären Speichern) IOW, solange der Compiler nichts neu anordnet, auch der Prozessor nicht. Es scheint, dass '/ volatile' für MS versucht, die Funktionalität von' std :: atomic' bereitzustellen, die bis C++ 11 nicht existierte. – Mysticial
Außerdem sagen sie "hat Release-Semantik", so dass die Dokumentation mit Sicherheit behauptet * 'volatile' verhindert CPU-Neuordnung. –
@Mysticial "Es scheint, dass/volatile für MS versucht, die Funktionalität von std :: atomic bereitzustellen" - nein, tut es nicht. Zum Beispiel ist nicht garantiert, dass Lese- und Schreiboperationen für "flüchtige" Variablen atomar sind. In der Tat sind sie - weil x86 Atomizität von Lese-und Schreiboperationen für 1-Byte-Variablen garantiert, aber es ist nicht in MSDN von "volatile" garantiert – FrozenHeart