In C# setting a value to a variable is atomic as long as its size is at most native int
(i.e. 4 bytes in a 32-bit runtime environment and 8 bytes on a 64-bit one).
In a 64-bit environment that includes all references types and most built-in value types (byte
, short
, int
, long
, etc.).
Setting a bigger value isn't atomic and can cause tearing where only part of the memory is updated.
DateTime
is a struct that includes only a single ulong
field containing all its data (Ticks
and the DateTimeKind
) and ulong
by itself is atomic in a 64-bit environment.
Does that mean that DateTime
is atomic as well? Or Can the following code lead to tearing at some point?
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();
}