Frage

Ist Zugriff auf ein Bool ein Atom in C #? Insbesondere muss ich um eine Sperre setzen:

class Foo
{
   private bool _bar;

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

   //... same for a read
   if (_bar) { ... }
}
War es hilfreich?

Lösung

Ja.

  

Lesen und Schreiben der folgenden Datentypen sind Atom: bool, char, byte, sbyte, kurz, ushort, uint, int, float und Referenztypen.

als gefunden in C # Sprache Spec .

Edit: Es ist wahrscheinlich auch lohnt Verständnis der < strong> volatiles Stichwort.

Andere Tipps

Wie oben angegeben Bool ist atomar aber Sie müssen noch remeber, dass es hängt auch davon ab, was man damit tun will.

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

ist kein Atom-Betrieb bedeutet, dass b-Wert vor dem aktuellen Thread ändern könnte den Code nach der if-Anweisung ausgeführt wird.

bool Zugriffe ist in der Tat atomar, aber das ist nicht die ganze Geschichte.

Sie müssen sich keine Sorgen über einen Wert zu lesen, die ‚unvollständig‘ geschrieben wird - es ist nicht klar, was das möglicherweise für eine Bool in jedem Fall bedeuten könnte - aber Sie haben über Prozessor-Caches sorgen, zumindest wenn Details des Timings sind ein Problem. Wenn Thread # 1 am Kern A laufen Ihren _bar im Cache hat, und _bar wird von Thread # 2 laufen auf einem anderen Kern aktualisiert Faden # 1 wird die Änderung nicht sofort sehen, es sei denn, Sie fügen sperren, erklärt _bar als volatile oder explizit Anrufe einfügen Thread.MemoryBarrier() dem zwischengespeicherten Wert ungültig zu machen.

der Ansatz, den ich verwendet habe, und ich glaube, richtig ist, ist

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

war das Ziel grundsätzlich zu vermeiden, repetively bei jeder Iteration um ein Objekt zu sperren nur zu prüfen, ob wir es, um zu sperren benötigt, die selten auftritt, eine große Menge von Zustandsänderungsinformationen bereitzustellen. I denken dieser Ansatz funktioniert. Und wenn absolute consistancy erforderlich ist, I denkt volatile falls auf dem b Bool wäre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top