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