2010-04-27 6 views
3

Dans cet article: Lock-Free Data Structures (pdf) les éléments suivants "Compare et échange" apparaît fondamentale:Structures de données Verrouillage sans en C++ Compare et échange de routine

template <class T> 
bool CAS(T* addr, T exp, T val) 
{ 
    if (*addr == exp) 
    { 
    *addr = val; 
    return true; 
    } 
    return false; 
} 

Et puis dit

Le toute la procédure est atomique

Mais comment cela se passe-t-il? Est-ce qu'il n'est pas possible qu'un autre acteur puisse changer la valeur de addr entre le if et l'assignation? Dans ce cas, en supposant que tout le code utilise ce CAS fondamental, il serait trouvé la prochaine fois que quelque chose "attendait" qu'il soit d'une certaine manière, et ce n'était pas le cas. Cependant, cela ne change pas le fait que cela puisse arriver, auquel cas, est-ce encore atomique? Qu'en est-il de l'autre acteur redevenu vrai, même quand les changements ont été écrasés par cet acteur? Si cela ne peut pas arriver, alors pourquoi?

Je veux croire l'auteur, alors qu'est-ce qui me manque ici? Je pense que cela doit être évident. Mes excuses à l'avance si cela semble trivial.

Répondre

8

Il décrit une opération atomique qui est donnée par l'implémentation, "en quelque sorte". C'est du pseudo-code pour quelque chose implémenté dans le matériel.

+1

Oui, l'auteur affirme que l'opération est atomique, puis vous donne du code afin que vous compreniez ce qu'il fait. Une implémentation (qui est atomique) est Microsoft InterlockedCompareExchange() (voir http://msdn.microsoft.com/en-us/library/ms683560(VS.85).aspx). Si vous compilez simplement ce code, ce n'est certainement pas atomique. –

+0

Avec GCC, vous avez également des opérateurs atomiques dont CAS décrit ici: http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html – Timo

Questions connexes