[C#] Est-ce un booléen en lecture / écriture atomique en C #


Answers

Comme indiqué ci-dessus, bool est atomique mais vous devez toujours vous rappeler que cela dépend aussi de ce que vous voulez faire avec.

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

n'est pas une opération atomique qui signifie que la valeur b peut changer avant que le thread en cours n'exécute le code après l'instruction if.

Question

L'accès à un champ bool atomique en C #? En particulier, dois-je mettre un verrou autour:

class Foo
{
   private bool _bar;

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

   //... same for a read
   if (_bar) { ... }
}



l'approche que j'ai utilisée, et je pense est correct, est

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'objectif était essentiellement d'éviter de devoir verrouiller de façon répétée un objet à chaque itération juste pour vérifier si nous avions besoin de le verrouiller afin de fournir une grande quantité d'informations de changement d'état qui se produit rarement. Je pense que cette approche fonctionne. Et si la consistance absolue est nécessaire, je pense que volatil serait approprié sur le booléen.