В параметре C# значение переменной является атомарным, если его размер не превышает native int
(т. Е. 4 байта в 32-битной среде выполнения и 8 байтов на 64-разрядной версии). В 64-битной среде, которая включает в себя все типы ссылок и большинство встроенных типов значений (byte
, short
, int
, long
и т. Д.).Может ли DateTime разрываться в 64-битной среде?
Установка большего значения не является атомарной и может вызвать разрывы, когда обновляется только часть памяти.
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();
}
, вероятно, самый окончательный ответ, который вы можете получить: «Я так не думаю». –
@MikeNakis Я также «не думаю так», но реализация ConcurrentDictionary' не обрабатывает «DateTime» как атомную, что заставляет меня задаться вопросом: [ConcurrentDictionary.IsValueWriteAtomic] (https://github.com/dotnet/ corefx/blob/master/src/System.Collections.Concurrent/src/System/Collections/Concurrent/ConcurrentDictionary.cs # L87) – i3arnon
@ i3arnon: в коде перечислены кучи интегральных типов с комментарием, указывающим на ссылку CLI. Ссылка на CLI касается только размеров, а не типов, и я серьезно сомневаюсь, что DateTime когда-либо будет использовать явно несогласованное поле, поэтому я думаю, что можно с уверенностью заключить, что 'DateTime' является атомарным. –