Является ли bool атомом чтения/записи в С#

Является ли доступ к полем bool атома в С#? В частности, мне нужно установить блокировку:

class Foo
{
   private bool _bar;

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

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

Ответ 1

Да.

Reads и writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, и reference types.

как указано в спецификации языка С#.

Изменение: Возможно, также стоит понять ключевое слово volatile.

Ответ 2

Как указано выше, bool является атомарным, но вам все равно нужно помнить, что он также зависит от того, что вы хотите с ним делать.

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

не является что значение b может измениться до того, как текущий поток выполнит код после оператора if.

Ответ 3

bool accesses действительно являются атомарными, но это не вся история.

Вам не нужно беспокоиться о чтении значения, которое "не полностью написано" - неясно, что это может означать для bool в любом случае - но вам нужно беспокоиться о кешках процессоров, по крайней мере если подробности о сроках являются проблемой. Если поток # 1, работающий на ядре A, имеет ваш кеш _bar, а _bar обновляется потоком # 2, запущенным на другом ядре, поток # 1 не увидит изменения немедленно, если вы не добавите блокировку, объявите _bar как volatile или явно вставлять вызовы Thread.MemoryBarrier(), чтобы аннулировать кешированное значение.

Ответ 4

подход, который я использовал, и я думаю, что это правильно,

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

цель состояла в основном в том, чтобы избежать необходимости повторной блокировки объекта на каждой итерации, чтобы проверить, нужно ли нам блокировать его, чтобы обеспечить большую информацию об изменении состояния, которая встречается редко. Я думаю, что этот подход работает. И если требуется абсолютная согласованность, я думаю, что volatile будет подходящим для bool.