Является ли доступ к полем bool атома в С#? В частности, мне нужно установить блокировку:
class Foo
{
private bool _bar;
//... in some function on any thread (or many threads)
_bar = true;
//... same for a read
if (_bar) { ... }
}
Является ли доступ к полем bool атома в С#? В частности, мне нужно установить блокировку:
class Foo
{
private bool _bar;
//... in some function on any thread (or many threads)
_bar = true;
//... same for a read
if (_bar) { ... }
}
Да.
Reads и writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, и reference types.
как указано в спецификации языка С#.
Изменение: Возможно, также стоит понять ключевое слово volatile.
Как указано выше, bool является атомарным, но вам все равно нужно помнить, что он также зависит от того, что вы хотите с ним делать.
if(b == false)
{
//do something
}
не является что значение b может измениться до того, как текущий поток выполнит код после оператора if.
bool accesses действительно являются атомарными, но это не вся история.
Вам не нужно беспокоиться о чтении значения, которое "не полностью написано" - неясно, что это может означать для 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 будет подходящим для bool.