.NET C # Multithreading

8

Frage zum Threading, um meine Neugierde zu befriedigen ...

Nehmen wir an, ich habe eine statische Variable _status (ProgressStatus) und viele Threads lesen davon. Um diese statische Variable zu aktualisieren, verwende ich ein unveränderliches Objekt ProgressStatus, erstelle eine neue Instanz und tausche dann die Referenz aus.

%Vor%

Hier ist der Lesercode

%Vor%

Was ist das Schlimmste, das passieren könnte, wenn ich das Schloss nicht anwende?

    
Mark 909 26.11.2010, 14:35
quelle

3 Antworten

7

Es ist möglich, dass andere Threads den neuen Wert nicht sehen.

Tatsächlich ist es noch möglich, dass sie den neuen Wert nicht sehen, es sei denn, sie sperren auch.

Auch wenn die Referenz atomar aktualisiert wird (dh es wird nie ein Wert sein, der eine Mischung aus alten und neuen Werten ist), sagt das nichts darüber aus, wann die Änderung für andere Threads sichtbar wird - oder wenn andere Threads eben sind stört die Überprüfung. (Zum Beispiel könnte ein Thread den Wert in einem Register zwischengespeichert haben, und ohne dass angegeben wird, dass der Thread benötigt, um den Hauptspeicher zu überprüfen, tut er dies möglicherweise nicht.)

Es ist möglich, dass Sie dies vermeiden, indem Sie die Variable als volatile deklarieren - aber ich habe aufgehört zu glauben, dass ich genau verstehe, was volatile bedeutet, um ehrlich zu sein.

Durch die konsistente Verwendung einer Sperre beim Arbeiten mit freigegebenen veränderbaren Daten (Lesen oder Schreiben) wird dieses Problem aufgrund der Semantik des Sperren aufgehoben. Korrekt und garantiert fehlerfrei zu arbeiten, erfordert ein wesentlich tieferes Verständnis dessen, was vor sich geht. (Beachten Sie, dass es die Variable ist, die hier änderbar ist, auch wenn das Objekt, auf das sie sich bezieht, dies nicht ist.)

    
Jon Skeet 26.11.2010, 14:38
quelle
0

Sie können eine Race-Bedingung erhalten, wenn Ihr Programm davon abhängt, dass dieser Wert auf vorhersehbare Weise aktualisiert wird.

Hier ist eine gute "lock-free" -Funktion:

%Vor%

Ich kann den Kredit nicht nehmen, ich fand es im Internet

Ссылка

    
Dean Chalk 26.11.2010 14:52
quelle
-1

Sie sollten die Sperre in diesem Fall nicht benötigen, da das Ändern einer Referenz eine atomare Operation ist.

    
ShZ 26.11.2010 14:37
quelle

Tags und Links