En C#, l'attribution d'une valeur à une variable est atomique tant que sa taille est au maximum native int
(c'est-à-dire 4 octets dans un environnement d'exécution 32 bits et 8 octets dans un environnement 64 bits). Dans un environnement 64 bits qui comprend tous les types de références et la plupart des types de valeurs intégrés ( byte
, short
, int
, long
etc.).
La définition d'une valeur plus grande n'est pas atomique et peut provoquer des déchirures lorsque seule une partie de la mémoire est mise à jour.
DateTime
est une structure qui ne comprend qu'un seul ulong
contenant toutes ses données ( Ticks
et le DateTimeKind
) et ulong
par lui-même est atomique dans un environnement 64 bits.
Est-ce que cela signifie que DateTime
est également atomique ? Ou le code suivant peut-il conduire à un déchirement à un moment donné ?
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();
}