5 Stimmen

Garantieren die Interlocked.Xxx-Methoden, dass der Wert in allen Datencaches aktualisiert wird?

Beispiel:

Thread a:  Interlocked.Increment(ref x);

Thread b:  int currentValue = x;

Wenn Thread b nach Thread a ausgeführt wird, ist "currentValue" in Thread b garantiert der erhöhte Wert? Oder muss Thread b ein Thread.VolatileRead(ref x) durchführen?

5voto

Eric J. Punkte 143512

Technisch gesehen hängt das vom CPU ab, auf dem .NET läuft, aber für jede gängige CPU lautet die Antwort ja, die Cache-Kohärenz ist für ein Interlocked.Increment garantiert. Es fungiert als Speicherbarriere, wie von MESI gefordert.

Ein CPU kann in seinem Cache eine Zeile haben, die ungültig ist, aber wo er noch nicht weiß, dass die Zeile ungültig ist - die Invalidierungs-Warteschlange enthält die Invalidierung, die noch nicht bearbeitet wurde. (Die Invalidierungs-Warteschlange befindet sich auf der anderen "Seite" des Caches; die CPU kann sie nicht scannen, wie den Speicher-Puffer). Deshalb sind Speicherbarrieren erforderlich.

http://en.wikipedia.org/wiki/MESI_protocol (x86)

MOESI (verwendet auf AMD64-Chips) ist ziemlich ähnlich:

http://en.wikipedia.org/wiki/MOESI_protocol (AMD64)

3voto

Marc Gravell Punkte 970173

Meines Verständnisses nach ist Interlocked nur garantiert, wenn es von anderen Interlocked Methoden zugegriffen wird. Dies kann besonders wichtig sein, wenn es um 64-Bit-Werte auf x86-Systemen geht, wo nicht garantiert werden kann, dass sie atomar sind, so dass Torn Values ein Problem darstellen. Ein guter Trick zum robusten Lesen eines Wertes, der von Interlocked geändert werden kann, ist CompareExchange:

int val = Interlocked.CompareExchange(ref field, 0, 0);

Dies ändert den Wert von field auf 0, aber nur, wenn der alte Wert 0 war - ansonsten tut es nichts. So oder so wird der alte Wert zurückgegeben. Also im Grunde genommen: Es liest den Wert, ohne ihn jemals zu ändern, und ist sicher gegen andere Interlocked Methoden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X