93 votes

Est un bool lecture/écriture atomique en C#

Est de l'accès à un bool domaine atomique en C#? En particulier, j'ai besoin de mettre un verrou autour de:

class Foo
{
   private bool _bar;

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

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

129voto

Larsenal Points 17080

Oui.

Lit et écrit des types de données suivants sont atomiques: bool, char, byte, sbyte, short, ushort, uint, int, float, et les types référence.

comme l'a constaté en Langage C# Spec.

Edit: Il est aussi probablement la peine de la compréhension de la volatilité mot-clé.

51voto

Dror Helper Points 15499

Comme indiqué ci-dessus bool est atomique, mais vous avez encore le besoin de me rappeler que ça dépend aussi de ce que vous voulez faire avec elle.

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

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

32voto

McKenzieG1 Points 5294

bool accès sont en effet atomique, mais ce n'est pas toute l'histoire.

Vous n'avez pas à vous soucier de la lecture d'une valeur qui est "partiellement écrit' - il n'est pas clair ce que cela pourrait signifier pour un bool, en tout cas - mais vous n'avez pas à vous soucier des caches du processeur, au moins si les détails de la synchronisation sont un problème. Si le thread n ° 1 en cours d'exécution sur base d'Un a votre _bar dans le cache, et _bar est mise à jour par le thread n ° 2 en cours d'exécution sur une autre base, le fil #1 ne verrez pas la changer immédiatement, sauf si vous ajoutez de verrouillage, déclarer _bar comme volatile, ou explicitement insérer des appels d' Thread.MemoryBarrier() d'invalider la valeur mise en cache.

1voto

stux Points 41

l'approche que j'ai utilisé, et je pense que c'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 pour éviter d'avoir à repetively verrouiller un objet à chaque itération juste pour vérifier si nous avions besoin pour le verrouiller afin de fournir une grande quantité de changement d'état de l'information qui se produit rarement. Je pense que cette approche fonctionne. Et si absolue consistancy est nécessaire, je pense volatils serait approprié sur le b bool.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X