2010-10-04 29 views

Répondre

2

Je suppose que vous envisagez de code comme ceci:

using System; 
using System.Threading; 

class Test 
{ 
    static int x = 1; 
    static int y = 2; 

    static void Main() 
    { 
     x = Interlocked.Exchange(ref y, 5); 
    } 
} 

Dans ce cas, non, l'opération est atomique. Dans IL, il y a deux actions distinctes:

  • appel de la méthode
  • Copie la valeur de la pile théorique au champ

Il serait tout à fait possible pour un autre thread à « voir » y devenir 5 avant la valeur de retour de Interlocked.Exchange a été stocké dans x. Personnellement, si je regardais quelque chose où vous auriez besoin de changer plusieurs valeurs de champs atomiquement, je considérerais les verrous à la place des opérations sans verrou atomiques.

+0

Merci @Jon. C'est ce dont j'avais peur. – IamIC

+0

Quel (le cas échéant) est l'équivalent C# de la commande ASM "XCHG" (http://siyobik.info/index.php?module=x86&id=328). Avec cette commande, qui est un véritable échange, je pourrais simplement échanger deux entrées, ce que j'essaie vraiment de faire. – IamIC

+0

@IanC: Je ne sais pas s'il existe * un *. NET équivalent, pour être honnête. –

0

Interlocked.Exchange Méthode (Int32, Int32) définition:

Définit un entier signé de 32 bits à une valeur spécifiée et retourne la valeur d'origine, comme une opération atomique.

Exemple de code dans MSDN L'article http://msdn.microsoft.com/en-us/library/d3fxt78a.aspx utilise le code de retour Interlocked.Exchange pour le verrouillage de ressources thread-safe. Donc, la réponse est oui, c'est une opération atomique.

Bien sûr, si vous exécutez Interlocked.Exchange dans différents threads et affectez la valeur de retour à la même variable, le résultat peut être incorrect. Mais il s'agit de règles générales de sécurité des threads - utilisez simplement la variable locale.

+0

Merci. L'exemple dans MSDN montre seulement examiner la valeur de retour. Je sais que l'échange est atomique. Ce que je ne sais pas, c'est si la définition de la valeur de retour dans une variable ferait également partie de l'opération atomique. – IamIC

+0

Je penserais minimalement qu'un devrait être marqué comme volatile. Cela n'a rien à voir avec l'atomicité, cependant. – IamIC

+0

Non, l'affectation de la valeur de retour ne fait pas partie de l'opération atomique, elle peut être vérifiée au niveau MSIL ou au niveau de l'assemblage natif. Ce n'est juste pas une partie de la fonction. Ceci est sûr si vous utilisez une variable locale allouée par pile pour conserver la valeur de retour. –