Cuando utilizar el bloqueo contra MemoryBarrier en .NET
-
18-09-2019 - |
Pregunta
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ódigo
lock(locker)
{
// Do something
}
es el mismo que
Monitor.Enter(locker);
try
{
// Do Something
}
finally
{
Monitor.Exit(locker);
}
Sin embargo, el marco .NET también incluye la clase MemoryBarrier
que funciona de una manera similar
Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();
Estoy confundido como cuando se desea utilizar Thread.MemoryBarrier
sobre la versión lock
/ Monitor
? Estoy hecho aún más confusa por una rosca Tutorial que establece que funcionan excedía misma.
Por lo que yo puedo ver la diferencia visible no es necesitar un objeto de bloqueo, lo que supongo que el uso de Monitor
se podría hacer algo a través de las discusiones donde MemoryBarrier
está en un solo hilo.
Mi instinto me dice que otra diferencia clave es MemoryBarrier
es para las variables y no para los métodos.
Finalmente esto no está relacionado con la pregunta existente Cuando usar 'volátil' o 'Thread.MemoryBarrier ()' en threadsafe código de bloqueo? (C #) , ya que se centra en la palabra clave volatile
que entiendo su uso de.
Solución
En mi opinión usted debe casi no Thread.MemoryBarrier
uso. Esto se utiliza para -cerradura libre Código - asegurándose de que los cambios realizados en un solo hilo son visibles a otro sin incurrir en el coste de una cerradura. Lo hace no sincronización de hilos de control, a diferencia de lock
. No veo dónde en el tutorial de Joe dice que "funciona de la misma" MemoryBarrier
como lock
. Podría explicar dónde exactamente que está recibiendo esa impresión de?
En mi opinión, el código libre de bloqueo de bajo nivel es demasiado difícil para casi cualquier persona que no sea desarrolladores cuyo dominio principal es la simultaneidad. Si quiero escribir algo de código libre de bloqueo, voy a usar bloques de construcción de nivel superior incorporado por los desarrolladores (tales como extensiones paralelas en .NET 4.0) en lugar de tratar de rodar mi propia.
A modo de ejemplo, recientemente he tenido mis ojos abiertos al significado preciso de volatile
que no es "siempre se lee de la memoria principal, siempre escribir directamente en la memoria principal". (Mi propia rosca tutorial todavía tiene esa explicación en el momento - algo que necesito fijar en algún momento.) es mucho más sutil que . Esto significa que algunos de mis usos anteriores de volatile
bien pueden ser incorrectos.