c# - significa - ¿Es esto(bool volátil) siempre hilo seguro?
variable volatile arduino (2)
Me pregunto si esto es completamente seguro para subprocesos y si la palabra clave volátil debería estar en su lugar o no.
using System.Threading;
class Program
{
private static volatile bool _restart = true;
private static void Main()
{
while (_restart)
{
// Do stuff here every time for as long as _restart is true
Thread.Sleep(1);
}
}
private static void SomeOtherThread()
{
Thread.Sleep(1000);
_restart = false;
}
}
Creo que lo es, pero quiero volver a verificar, ya que no estoy 100% seguro de que solo quiero estar seguro.
Creo que la palabra clave volátil es necesaria porque entonces nunca sería posible tener el valor almacenado en caché en registros o optimizaciones similares.
Debe reemplazar toda la construcción con un ManualResetEvent
, que es seguro y rápido para subprocesos.
private static readonly ManualResetEvent ev = new ManualResetEvent();
private static void Main()
{
ev.WaitOne()
}
private static void SomeOtherThread()
{
Thread.Sleep(1000);
ev.Set();
}
La respuesta de SLaks es correcta, por supuesto, pero para responder a su pregunta: sí en ambos sentidos: es seguro, debe ser declarado volátil