Код: Выделить всё
internal class Employee
{
internal int concurrentState;
internal void SetConcurrentState(int concurrentStatus)
{
Interlocked.Exchange(ref this.concurrentState, concurrentStatus);
}
internal int GetConcurrentState()
{
return Interlocked.CompareExchange(ref this.concurrentState,
0,
-this.concurrentState);
}
}
Дополнение: @mjwills опубликовал ссылку на спецификацию C Sharp, и из нее вот это...< /p>
9.6 Атомарность ссылок на переменные Чтение и запись следующих типов данных должны быть атомарными: bool, char, byte, sbyte, short, ushort,
инт, инт, типы с плавающей запятой и ссылочные типы. Кроме того, операции чтения и записи
типов перечислений с базовым типом из предыдущего списка также должны
быть атомарными. Чтение и запись других типов, включая long, ulong,
double и decimal, а также определяемые пользователем типы, не обязательно должны быть
атомарными. Помимо библиотечных функций, предназначенных для этой цели,
нет гарантии атомарного чтения-изменения-записи, например, в случае
инкремента или декремента.
Однако в документе CLI говорится, что атомарные операции гарантируются только при условии правильного выравнивания границ слов в связанном с этим тексте...
Соответствующий интерфейс командной строки должен гарантировать, что чтение и доступ на запись к
встроенным примитивным типам значений и указателям на правильно выровненные ячейки памяти
, не превышающие собственный размер слова (размер типа Native
int), является атомарным (см. §I .12.6.2), когда все доступы для записи к
местоположению имеют одинаковый размер.
Второе дополнение: Этот ответ на аналогичный вопрос указывает на то, что позднее изменение преобразование int в long может нарушить атомарность чтения. Поэтому хорошая причина использовать Interlocked.CompareExchange — не полагаться на присущую reaon атомарность int, которая может быть изменена на long. Сейчас это закрытый вопрос, но если бы мне пришлось ответить на него, я бы ответил, что это хороший метод, и риск поломки, вероятно, был тем, о чем я думал, когда писал его (давно). Я бы очистил его, используя эквивалент Interlocked.CompareExchange(ref v, 0, 0).
Подробнее здесь: https://stackoverflow.com/questions/792 ... in-c-sharp
Мобильная версия