En .NET es la palabra clave lock
azúcar sintáctico alrededor Monitor.Enter
y Monitor.Exit
, por lo que se podría decir que este códigoAl utilizar el bloqueo contra MemoryBarrier en .NET
lock(locker)
{
// Do something
}
es lo mismo que
Monitor.Enter(locker);
try
{
// Do Something
}
finally
{
Monitor.Exit(locker);
}
Sin embargo, el .NET framework también incluye la clase MemoryBarrier
que funciona de manera similar
Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();
Estoy confundido como cuando quisiera usar Thread.MemoryBarrier
sobre la versión lock
/Monitor
? Estoy aún más confundido por a Threading Tutorial que indica que funcionan lo mismo.
Por lo que puedo ver, la diferencia visible no necesita un objeto de bloqueo, lo que supongo que al usar Monitor
podría hacer algo entre subprocesos donde MemoryBarrier
está en una sola cadena.
Mi instinto me dice que otra diferencia clave es MemoryBarrier
es solo para variables y no para métodos.
Por último, esto no está relacionado con la pregunta existente When to use ‘volatile’ or ‘Thread.MemoryBarrier()’ in threadsafe locking code? (C#), ya que se está centrando en la palabra clave volatile
que entiendo su uso.
En el tutorial de Joe (en la página que enlazo) buscar 'Barreras de memoria y bloqueo' hay un breve párrafo que dice que son equivalentes "si ignoramos la garantía de exclusión mutua de un candado". –
Sin embargo, ignorar la exclusión mutua hace que la comparación no tenga sentido ya que es un componente integral de los bloqueos – Grizzly
@Grizzly: La comparación no es inútil; es útil en términos de * vallas *. Pero eso no es lo mismo que decir que las dos cosas "funcionan igual", porque la garantía de exclusión mutua es el principal punto de bloqueo. –