2010-04-29 3 views
35

je ne pouvais trouver aucune référence à ce sujet dans les ... documentationL'assignation de variable et la lecture d'opération atomique?

est d'attribuer à un double (ou tout autre type simple, y compris booléen) une opération atomique vu dans la perspective de discussions?

double value = 0; 

public void First() { 
while(true) { 
    value = (new Random()).NextDouble(); 
} 
} 

public void Second() { 
while(true) { 
    Console.WriteLine(value); 
} 
} 

Dans cet exemple de code, la première méthode est appelée dans un thread, et la seconde dans un autre. La seconde méthode peut-elle obtenir une valeur foirée si elle est exécutée lors de l'affectation à la variable dans un autre thread? Je ne m'inquiète pas si je reçois l'ancienne valeur, il est seulement important de recevoir une valeur valide (pas une où 2 octets sur 8 sont définis). Je sais que c'est une question stupide, mais je veux être sûr, parce que je ne sais pas comment CLR définit réellement les variables.

+27

Ce n'est pas une question stupide. –

+0

@EricLippert Objet a = 10; Est-ce aussi une opération atomique? J'ai lu MSDN, vos articles etc. Mais ne peux pas sembler trouver la réponse à lui. car cela implique 2 étapes. boxe puis affectation – Ehsan

+0

@NoOne: La mutation de la variable 'a' est atomique car' object' est un type de référence. La boxe n'y entre pas. –

Répondre

24

Pour répondre à votre question, non. Les affectations aux doubles ne sont pas garanties comme étant atomiques. Les documents sont disponibles here. Fondamentalement, < = les types intégrés 32 bits sont atomiques, les types> = 64 bits ne le sont pas. Pour les opérations atomiques sur les types 64 bits, vous pouvez utiliser les méthodes sur System.Threading.Interlocked

Questions connexes