Es gibt keinen atomaren -Typ . Nur Operationen können atomar sein.
Lesen und Schreiben eines Datentyps, der in ein einzelnes Wort passt ( int
auf einem 32-Bit-Prozessor, long
auf einem 64-Bit-Prozessor) ist technisch "atomar", aber der Jitter und / oder Prozessor kann beschließen, Anweisungen neu zu ordnen und somit unerwartete Wettlaufbedingungen zu schaffen, so müssen Sie entweder den Zugriff mit lock
serialisieren, die Klasse Interlocked
für Schreibvorgänge (und in einigen Fällen auch Lesevorgänge) verwenden oder die Variable volatile
deklarieren.
Die kurze Antwort lautet: Wenn zwei verschiedene Threads auf dasselbe Feld / dieselbe Variable zugreifen können und mindestens einer von ihnen schreibt, müssen Sie eine Art Locking verwenden. Für primitive Typen ist das in der Regel die Klasse Interlocked
.
Ähnliche Frage hier
Für die endgültige Antwort gehen Sie zu Spez. :)
Partition I, Abschnitt 12.6.6 des CLI Spezifikation besagt: "Eine konforme CLI soll Garantie für Lese- und Schreibzugriff richtig ausgerichtete Speicherplätze nicht größer als die ursprüngliche Wortgröße atomar, wenn alle Schreibzugriffe auf Ein Standort hat die gleiche Größe. "
Das bestätigt also, dass s_Initialized wird nie instabil sein, und das lesen und schreibt auf primitive Typen atomar.
Interlocking erzeugt eine Speicherbarriere um den Prozessor zu verhindern Neuordnung liest und schreibt. Das Schloss schafft die einzige erforderliche Barriere in Dieses Beispiel.
John.
Im Wesentlichen haben Sie kein "Absturz" -Problem, wenn Sie ein Bool nicht sperren. Was Sie haben können, ist eine Race Condition für die Reihenfolge, in der das Bool aktualisiert oder gelesen wird. Wenn Sie nicht wissen wollen, dass das Bool in einer bestimmten Reihenfolge geschrieben / gelesen wird, dann sollten Sie eine Art Sperrmechanismus verwenden.
Sortieren. Es gibt einen ausgezeichneten Thread über diese hier , aber die kurze Version ist, während ein gegebenes Lesen oder Schreiben atomar sein kann, ist das fast nie das, was Sie tun. Wenn Sie beispielsweise eine Ganzzahl erhöhen möchten, müssen Sie 1) den Wert lesen, 2) einen Wert hinzufügen und 3) den Wert zurückspeichern. Jeder dieser Vorgänge kann unterbrochen werden.
Das ist der Grund für Klassen wie "Interlocked".
Statische Grundtypen sind threadsafe, so dass Sie diese typisierten Variablen nicht sperren müssen. Jede Instanzvariable eines primitiven Typs ist jedoch nicht garantiert. Siehe hier: Sind primitive Typen wie bool threadsafe?
Und hier ist ein weiterer nützlicher Link, der auch interessant sein könnte. Ich finde die Lösung sehr überzeugend: SO Frage: Wie kann ich feststellen, ob eine C # -Methode Thread-sicher ist?
Tags und Links c# thread-safety atomic primitive