Является ли bool атомарным для чтения / записи в C#



обращается к буль поле atomic в C#? В частности, мне нужно поставить замок вокруг:



class Foo
{
private bool _bar;

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

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

4 ответов:

да.

чтение и запись следующих типов данных являются атомарными: bool, char, byte, sbyte, short, ushort, uint, int, float и ссылочные типы.

Как найти в Спецификация Языка C#.

Edit: вероятно, также стоит понять volatile ключевое слово.

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

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

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

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

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

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

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 было бы уместно на B bool.

Comments

    Ничего не найдено.