Mi preocupación principal es con el indicador booleano ... ¿es seguro usarlo sin ninguna sincronización? He leído en varios lugares que es atómico (incluida la documentación).¿Es seguro usar un indicador booleano para detener la ejecución de un hilo en C#
class MyTask
{
private ManualResetEvent startSignal;
private CountDownLatch latch;
private bool running;
MyTask(CountDownLatch latch)
{
running = false;
this.latch = latch;
startSignal = new ManualResetEvent(false);
}
// A method which runs in a thread
public void Run()
{
startSignal.WaitOne();
while(running)
{
startSignal.WaitOne();
//... some code
}
latch.Signal();
}
public void Stop()
{
running = false;
startSignal.Set();
}
public void Start()
{
running = true;
startSignal.Set();
}
public void Pause()
{
startSignal.Reset();
}
public void Resume()
{
startSignal.Set();
}
}
¿Es esta una forma segura de diseñar una tarea de esta manera? ¿Alguna sugerencia, mejoras, comentarios?
Nota: Escribí mi clase personalizada CountDownLatch
en caso de que se esté preguntando de dónde estoy obteniendo.
Actualización:
Aquí es mi CountDownLatch también:
public class CountDownLatch
{
private volatile int m_remain;
private EventWaitHandle m_event;
public CountDownLatch (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();
}
}
@Remus Buena captura en mi orden de código while loop. En cuanto a la bandera volátil: ¿realmente hace una diferencia si la bandera es volátil en este caso? Si pierde la primera actualización, hará una ejecución más por el ciclo y la capturará la próxima vez ... – Kiril
Si no lo marca como volátil, el código generado podría optimizar el valor en un registro y su thread * never * verá el cambio. –
@Remus Lo entiendo ahora: la atomicidad no tiene nada que ver con la visibilidad entre los hilos ... El hecho de que una operación se ejecute en un ciclo de CPU no significa que el resultado será visible para los otros hilos a menos que el valor está marcado como volátil. – Kiril