true - if con boolean en c#
Es un bool leer/escribir atómico en C# (4)
Como se indicó anteriormente, bool es atómico, pero aún necesita recordar que también depende de lo que quiera 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.
¿Está accediendo a un campo bool atómico en C #? En particular, ¿necesito cerrarlo?
class Foo
{
private bool _bar;
//... in some function on any thread (or many threads)
_bar = true;
//... same for a read
if (_bar) { ... }
}
Los accesos bool son ciertamente atómicos, pero esa no es toda la historia.
No tiene que preocuparse por leer un valor que está ''incompletamente escrito'' - no está claro qué podría significar para un bool en cualquier caso - pero debe 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 hilo n.º 2 ejecutándose en otro núcleo, el hilo nº 1 no verá el cambio inmediatamente a menos que agregue el bloqueo, declare _bar
como volatile
o inserte llamadas explícitamente a Thread.MemoryBarrier()
para invalidar el valor en caché.
el enfoque que he usado, 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;
}
}
}
el objetivo era básicamente evitar tener que bloquear reiteradamente 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 que rara vez se produce. Creo que este enfoque funciona. Y si se requiere consistencia absoluta, creo que volátil sería apropiado en el b bool.
Sí.
Las lecturas y escrituras de los siguientes tipos de datos son atómicos: bool, char, byte, sbyte, corto, ushort, uint, int, float y tipos de referencia.
como se encuentra en C # Language Spec .
Editar: Probablemente también valga la pena entender la palabra clave volatile .