È un bool di lettura/scrittura atomico in C#
-
09-06-2019 - |
Domanda
Sta accedendo a bool campo atomico in C#?In particolare, devo mettere un lucchetto attorno:
class Foo
{
private bool _bar;
//... in some function on any thread (or many threads)
_bar = true;
//... same for a read
if (_bar) { ... }
}
Soluzione
SÌ.
Le letture e le scritture dei seguenti tipi di dati sono atomiche:tipi bool, char, byte, sbyte, short, ushort, uint, int, float e riferimento.
come trovato in Specifiche del linguaggio C#.
Modificare:Probabilmente vale anche la pena capire il volatile parola chiave.
Altri suggerimenti
Come affermato sopra, bool è atomico ma devi comunque ricordare che dipende anche da cosa vuoi farci.
if(b == false)
{
//do something
}
non è un'operazione atomica 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 questa non è tutta la storia.
Non devi preoccuparti di leggere un valore che è "scritto in modo incompleto" - non è chiaro cosa potrebbe significare in ogni caso per un bool - 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 il file your _bar
nella cache e _bar
viene aggiornato dal thread n. 2 in esecuzione su un altro core, il thread n. 1 non vedrà immediatamente la modifica a meno che non si aggiunga il blocco, dichiarare _bar
COME volatile
, o inserire esplicitamente chiamate a Thread.MemoryBarrier()
per invalidare il valore memorizzato nella cache.
l'approccio che ho usato, e penso che 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'obiettivo era fondamentalmente quello di evitare di dover bloccare ripetutamente un oggetto ad ogni iterazione solo per verificare se fosse necessario bloccarlo in modo da fornire una grande quantità di informazioni sul cambiamento di stato che si verifica raramente.IO pensare questo approccio funziona.E se è necessaria una coerenza assoluta, I pensare volatile sarebbe appropriato su b bool.