Является ли логическое чтение/запись атомарным в C#?

StackOverflow https://stackoverflow.com/questions/59422

Вопрос

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

class Foo
{
   private bool _bar;

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

   //... same for a read
   if (_bar) { ... }
}
Это было полезно?

Решение

Да.

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

как найдено в Спецификация языка C#.

Редактировать:Вероятно, также стоит понять изменчивый ключевое слово.

Другие советы

Как указано выше, 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;
       }
     }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top