В параметре С# значение переменной равно атомному, если его размер не превышает 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();
}