2011-09-20 3 views
4

Est-ce que quelqu'un est au courant d'une manière sans verrou d'effectuer ce qui est logiquement équivalent à un compare_and_swap_if_greater_than()? Nous avons compare_and_swap(), qui est en fait compare_and_swap_if_equal(). Le mieux que je puisse faire en ce moment est d'utiliser un mutex de spin, mais je pense qu'avec les utilisations de l'historique, des boucles, et de compare_and_swap(), il est possible d'éviter cela.Incrément sans verrouillage si supérieur à

Répondre

1

Que diriez-vous ceci:

public static void CompareAndSwapIfGreaterThan(ref int location, int newValue) { 
    while(true) { 
    var currentValue=Thread.VolatileRead(ref location); 
    if(newValue<=currentValue 
     || Interlocked.CompareExchange(ref location, newValue, currentValue)==currentValue) { 
     return; 
    } 
    } 
} 
+0

Je ne suis pas sûr que ce soit correct. Je pense que minimalement vous avez besoin d'une boucle autour de cette dernière condition dans le OU pour le cas où! = CurrentValue. Je pourrais certainement avoir tort cependant. – tgoodhart

+0

@tgoodhart: Je pense que la boucle externe s'occupe de ce cas. C'est une formulation assez standard pour la mise à jour atomique d'une valeur en utilisant compare & swap ... Read old value; calculer une nouvelle valeur; stocker conditionnellement la nouvelle valeur; et essayez à nouveau si quelqu'un vous a battu. Je crois que cela fonctionne. – Nemo

+0

Yup. Tu as raison. – tgoodhart

Questions connexes