Код: Выделить всё
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), когда все доступы на запись к
месту имеют одинаковый размер.
Подробнее здесь: https://stackoverflow.com/questions/792 ... in-c-sharp
Мобильная версия