He estado leyendo la respuesta a una similar question, pero todavía estoy un poco confundido ... Abel tuvo una gran respuesta, pero esta es la parte que estoy seguro acerca de:¿El enclavamiento garantiza la visibilidad de otros hilos en C# o aún tengo que usar volátiles?
.. .declarar una variable volátil lo hace volátil para cada acceso . Es imposible forzar este comportamiento de de otra manera, por lo tanto, el volátil no se puede reemplazar con Enclavamiento. Esto es necesario en escenarios donde otras bibliotecas, interfaces o hardware pueden acceder a su variable y actualizarla en cualquier momento, o necesitan la versión más reciente .
¿Tiene Interlocked
visibilidad garantía de la operación atómica de todas las discusiones, o tengo todavía tiene que utilizar la palabra clave volatile
en el valor con el fin de garantizar la visibilidad del cambio?
Aquí está mi ejemplo:
volatile int value = 100000; // <-- do I need the volitile keyword
// ....
public void AnotherThreadMethod()
{
while(Interlocked.Decrement(ref value)>0)
{
// do something
}
}
public void AThreadMethod()
{
while(value > 0)
{
// do something
}
}
Actualización:
yo era un mal deportista y he cambiado el ejemplo original, por lo que aquí está otra vez:
public class CountDownLatch
{
private volatile int m_remain; // <--- do I need the volatile keyword here?
private EventWaitHandle m_event;
public CountDownLatch(int count)
{
Reset(count);
}
public void Reset(int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException();
m_remain = count;
m_event = new ManualResetEvent(false);
if (m_remain == 0)
{
m_event.Set();
}
}
public void Signal()
{
// The last thread to signal also sets the event.
if (Interlocked.Decrement(ref m_remain) == 0)
m_event.Set();
}
public void Wait()
{
m_event.WaitOne();
}
}
Lo siento por las ediciones múltiples ... Remus ha sido un buen deportista al respecto. ¡Gracias por la información! :) – Kiril