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) { ... }
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top