Welche Art von 'volatile' Operation wird in Double checked locking in .NET benötigt

8

Ich habe den Code von DCL aus Joe Duffys Buch 'Concurrent programing on windows'

genommen %Vor%

es wird gesagt, dass die Markierung m_value volatile die Neuordnung von Schreibvorgängen verhindern kann, die dazu führt, dass andere Threads ein "Nicht-Null-Objekt mit nicht initialisierten Feldern" erhalten. Wenn das Problem nur auftritt, weil die mögliche Schreibreihenfolge neu ist, kann ich einfach 'Volatile Write' verwenden, anstatt das Feld flüchtig zu markieren, wie unten? (Dieser Code sieht zur Demonstration etwas umständlich aus, ich möchte nur sicherstellen, dass wir stattdessen nur flüchtiges Schreiben verwenden können)

%Vor%

Eine verwandte Frage ist die Interlocked-Version aus dem Buch

%Vor%

Da die ECMA-CLI die 'Interlocked Operation implizite Übernahme / Freigabe Operationen' spezifiziert, brauchen wir in diesem Fall immer noch volatile?

    
Fei 26.11.2011, 15:46
quelle

1 Antwort

1

Erstens, das Mischen mit Volatile ist wirklich schwer , also lass dich nicht zu sehr damit verlieren! Aber hier ist eine wirklich nahe Antwort auf Ihre Frage und < a href="http://www.albahari.com/threading/part4.aspx#_The_volatile_keyword"> hier ist ein Artikel, den ich denke, jeder sollte lesen, bevor Sie das Schlüsselwort volatile verwenden, und definitiv bevor Sie beginnen Verwenden Sie VolatileRead , VolatileWrite und MemoryBarrier .

Die Antwort im ersten Link lautet: Nein, Sie müssen nicht volatile verwenden, Sie müssen nur System.Threading.Thread.MemoryBarrier() RIGHT verwenden, BEVOR Sie den neuen Wert zuweisen. Dies liegt daran, dass die release_fence , die bei der Verwendung des Schlüsselworts "volatile" verwendet wird, sicherstellt, dass es vollständig in den Hauptspeicher geschrieben wird und dass keine Lese- / Schreiboperationen ausgeführt werden können, bis es beendet ist.

Also, was macht Thread.VolatileWrite (), und führt es die gleichen Funktionen aus wie das Schlüsselwort "volatile"? Nun, hier ist der vollständige Code von dieser Funktion:

%Vor%

Ja, es ruft MemoryBarrier direkt bevor es Ihren Wert zuweist, was ausreichend ist!

    
DanTheMan 27.11.2011, 00:27
quelle

Tags und Links