Pregunta

¿Está accediendo a un booleano campo atómico en C#?En particular, ¿necesito poner un candado alrededor de:

class Foo
{
   private bool _bar;

   //... in some function on any thread (or many threads)
   _bar = true;

   //... same for a read
   if (_bar) { ... }
}
¿Fue útil?

Solución

Sí.

Las lecturas y escrituras de los siguientes tipos de datos son atómicas:bool, char, byte, sbyte, short, ushort, uint, int, float y tipos de referencia.

como se encuentra en Especificaciones del lenguaje C#.

Editar:Probablemente también valga la pena comprender el volátil palabra clave.

Otros consejos

Como se indicó anteriormente, bool es atómico, pero aún debes recordar que también depende de lo que quieras hacer con él.

if(b == false)
{
    //do something
}

no es una operación atómica, lo que significa que el valor B podría cambiar antes de que el hilo actual ejecute el código después de la instrucción IF.

Los accesos a bool son realmente atómicos, pero esa no es toda la historia.

No tiene que preocuparse por leer un valor que está "escrito de forma incompleta" (no está claro qué podría significar eso para un bool en cualquier caso), pero sí tiene que preocuparse por los cachés del procesador, al menos si los detalles de el tiempo es un problema.Si el hilo #1 que se ejecuta en el núcleo A tiene su _bar en caché, y _bar se actualiza mediante el subproceso n.º 2 que se ejecuta en otro núcleo, el subproceso n.º 1 no verá el cambio inmediatamente a menos que agregue bloqueo, declare _bar como volatile, o insertar explícitamente llamadas a Thread.MemoryBarrier() para invalidar el valor almacenado en caché.

El enfoque que he utilizado, y creo que es correcto, es

volatile bool b = false;

.. rarely signal an update with a large state change...

lock b_lock
{
  b = true;
  //other;
}

... another thread ...

if(b)
{
    lock b_lock
    {
       if(b)
       {
           //other stuff
           b = false;
       }
     }
}

Básicamente, el objetivo era evitar tener que bloquear repetidamente un objeto en cada iteración solo para verificar si necesitábamos bloquearlo para proporcionar una gran cantidad de información de cambio de estado, lo cual rara vez ocurre.I pensar este enfoque funciona.Y si se requiere una coherencia absoluta, yo pensar volátil sería apropiado en el bool b.

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