В C # установка значения переменной является атомарной, если ее размер не превышает native int
(т.е. 4 байта в 32-битной среде выполнения и 8 байтов в 64-битной). В 64-битной среде, которая включает все типы ссылок и большинство встроенных типов значений (byte
, short
, int
, long
и т. Д.).
Установка большего значения не атомарна и может вызвать разрыв, когда обновляется только часть памяти.
DateTime
- это структура, которая включает только одно поле ulong
, содержащее все его данные (Ticks
и DateTimeKind
), а ulong
сам по себе является атомарным в 64-битной среде.
Означает ли это, что DateTime
тоже атомарен? Или может ли следующий код в какой-то момент привести к разрыву?
static DateTime _value;
static void Main()
{
for (int i = 0; i < 10; i++)
{
new Thread(_ =>
{
var random = new Random();
while (true)
{
_value = new DateTime((long)random.Next() << 30 | (long)random.Next());
}
}).Start();
}
Console.ReadLine();
}
ConcurrentDictionary
не рассматриваетDateTime
как атомарность, что заставляет меня задуматься: ConcurrentDictionary.IsValueWriteAtomic - person i3arnon   schedule 15.02.2017DateTime
является атомарным. - person Stephen Cleary   schedule 15.02.2017DateTime
соответствует этой категории в 64-битной системе. ОднакоConcurrentDictionary
кажется гораздо более консервативным, чем стандарт: он не будет рассматривать no-large-than-native-intstruct
s как атомарные, он будет рассматривать только встроенные примитивные типы данных как атомарные. Принято считать, что это, вероятно, недостаток вConcurrentDictionary
, но обратите внимание, как я пишу комментарий, а не ответ! C -: = - person Mike Nakis   schedule 15.02.2017DateTime
et al. и форма API (который, к сожалению, работает достаточно хорошо для простых случаев). Есть некоторые случайные ошибки, из-за которых некоторые варианты использования невозможно решить изначально. - person Clockwork-Muse   schedule 16.02.2017long
и заключил бы его в свойствоDateTime
. Здесь нулевой риск. - person Eli Arbel   schedule 16.02.2017