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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top