In .NET das lock
Schlüsselwort ist syntaktischer Zucker um Monitor.Enter
und Monitor.Exit
, so dass Sie, dass dieser Code sagen könnenWenn die Sperre verwenden vs Memory in .NET
lock(locker)
{
// Do something
}
die gleichen wie
sindMonitor.Enter(locker);
try
{
// Do Something
}
finally
{
Monitor.Exit(locker);
}
Allerdings enthält das .NET-Framework auch die MemoryBarrier
-Klasse, die auf ähnliche Weise funktioniert.
Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();
Ich bin verwirrt, wenn ich Thread.MemoryBarrier
über die lock
/Monitor
Version verwenden möchte? Ich bin noch mehr durch a Threading Tutorial verwirrt, die besagt, dass sie die gleichen funktionieren.
Soweit ich sehen kann, benötigt der sichtbare Unterschied kein Sperrobjekt, was ich denke, dass mit Monitor
Sie etwas über Threads tun können, wo MemoryBarrier
auf einem einzigen Thread ist.
Mein Darm sagt mir, dass ein weiterer wichtiger Unterschied ist MemoryBarrier
ist nur für Variablen und nicht für Methoden.
Schließlich ist dies nicht auf die bestehende Frage When to use ‘volatile’ or ‘Thread.MemoryBarrier()’ in threadsafe locking code? (C#), wie das auf das volatile
Schlüsselwort bezieht, die ich verstehe seine Verwendung von.
In Joes Tutorial (auf der Seite, die ich verlinke) nach 'Speicherbarrieren und Sperren' gibt es einen kurzen Absatz, der besagt, dass sie äquivalent sind, "wenn wir die gegenseitige Ausschlussgarantie einer Sperre ignorieren". –
Aber ignorieren den gegenseitigen Ausschluss macht den Vergleich Art von sinnlos, da das ein integraler Bestandteil der Schlösser ist – Grizzly
@Grizzly: Der Vergleich ist nicht sinnlos - es ist nützlich in Bezug auf * Zäune *. Aber das ist nicht dasselbe wie zu sagen, dass die zwei Dinge "gleich funktionieren" - weil die gegenseitige Ausschlussgarantie der Hauptpunkt der Sperrung ist. –