Ich weiß, dass das .NET-Speichermodell (auf dem .NET Framework; nicht kompakt/micro/silverlight/mono/xna/was-haben-Sie) garantiert, dass für bestimmte Typen (vor allem primitive Ganzzahlen und Referenzen) Operationen garantiert wurden atomar sein..NET-Speichermodell, flüchtige Variablen und Test-and-Set: Was ist garantiert?
Weiter glaube ich, dass die x86/x64 Test-und-Set-Anweisung (und Interlocked.CompareExchange
) tatsächlich verweist auf den globalen Speicherort, so dass, wenn es erfolgreich ist eine andere Interlocked.CompareExchange
würde den neuen Wert sehen.
Schließlich glaube ich, dass das volatile
Schlüsselwort ist eine Anweisung an den Compiler zu propagieren liest & schreibt so schnell wie möglich und Operationen über diese Variable nicht neu anordnen (rechts?).
Dies führt zu einigen Fragen:
- oben richtig meine Überzeugungen?
Interlocked.Read
hat keine Überladung für int, nur für Longs (das sind 2 Wörter und werden daher normalerweise nicht atomar gelesen). Ich habe immer angenommen, dass das .NET-Speichermodell garantiert, dass der neueste Wert beim Lesen von Ints/Referenzen zu sehen ist, jedoch mit Prozessor-Caches, -Registern usw. Ich beginne zu sehen, dass dies möglicherweise nicht möglich ist. Gibt es eine Möglichkeit, die Variable erneut zu holen?- Ist volatile ausreichend, um das obige Problem für Ganzzahlen und Referenzen zu lösen?
- auf x86/x64 kann ich davon ausgehen, dass ...
Wenn es zwei Integer sind globale Variablen x und y, die beide auf 0 initialisiert, dass, wenn ich schreibe:
x = 1;
y = 2;
, dass kein Faden wird sehen x = 0 und y = 2 (dh die Schreibvorgänge werden in der Reihenfolge auftreten). Ändert sich das, wenn sie volatil sind?
Das Problem mit der Verknüpfung von "C Keyword Myths Zerstreut" in etwas über .NET ist, dass eine Hauptquelle von Mythen über "volatile" ist, dass Menschen so tun, als wäre es das gleiche in C, C# und Java. In C# 'volatile' gibt es tatsächlich eine Ordnungssemantik wie in http://msdn.microsoft.com/en-us/library/aa645755%28v=VS.71%29.aspx. –
"Thread könnte tatsächlich x = 0 und y = 2" - seit .NET 2.0 Schreibvorgänge können nicht neu geordnet werden. – Vlad