Sind primitive Datentypen in c # atomic (thread safe)?

8

Muss ich zum Beispiel einen bool Wert beim Multithreading sperren?

    
Benny 12.03.2010, 15:36
quelle

4 Antworten

15

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 .

    
Aaronaught 12.03.2010, 15:43
quelle
2

Ä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.

    
NebuSoft 12.03.2010 15:38
quelle
2

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".

    
jvenema 12.03.2010 15:42
quelle
1

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?

MSDN PrimitiveType-Klasse

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?

    
Will Marcouiller 12.03.2010 15:41
quelle

Tags und Links