È un bool leggere / scrivere atomico in C #

Sta entrando in un campo bool atomico in C #? In particolare, ho bisogno di mettere un blocco:

class Foo { private bool _bar; //... in some function on any thread (or many threads) _bar = true; //... same for a read if (_bar) { ... } } 

Sì.

Le letture e le scritture dei seguenti tipi di dati sono atomiche: bool, char, byte, sbyte, short, ushort, uint, int, float e reference.

come trovato in C # Language Spec .

Modifica: Probabilmente è anche utile comprendere la parola chiave volatile .

Come detto sopra, il bool è atomico ma è comunque necessario ricordare che dipende anche da cosa si vuole fare con esso.

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

non è un’operazione atomica, il che significa che il valore b potrebbe cambiare prima che il thread corrente esegua il codice dopo l’istruzione if.

gli accessi bool sono davvero atomici, ma non è tutta la storia.

Non devi preoccuparti di leggere un valore che è “scritto in modo incompleto” – non è chiaro cosa potrebbe significare per un bool in ogni caso – ma devi preoccuparti delle cache del processore, almeno se i dettagli di i tempi sono un problema. Se il thread n. 1 in esecuzione sul core A ha la tua _bar nella cache e _bar viene aggiornato dal thread n. 2 in esecuzione su un altro core, il thread n. 1 non vedrà la modifica immediatamente a meno che non aggiungi il blocco, dichiari _bar come volatile o inserisci esplicitamente le chiamate Thread.MemoryBarrier() per invalidare il valore memorizzato nella cache.

l’approccio che ho usato, e penso sia corretto, lo è

 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; } } } 

l’objective era fondamentalmente quello di evitare di dover bloccare ripetutamente un object ad ogni iterazione solo per verificare se fosse necessario bloccarlo per fornire una grande quantità di informazioni sullo stato che si verificano raramente. Penso che questo approccio funzioni. E se è richiesta una coerenza assoluta, penso che volatile sia appropriato per il b bool.