En supposant que CompareAndSwap (ou CAS) ne manque jamais faussement, est-ce que CompareExchange peut être implémenté avec CAS? CompareExchange prend un pointeur, une valeur attendue et une nouvelle valeur et définit atomiquement la mémoire référencée par le pointeur sur la nouvelle valeur s'il correspond à la valeur attendue. La différence entre les deux est que CompareExchange renvoie la valeur précédente de la zone de mémoire et CompareAndSwap renvoie un bool indiquant le succès ou l'échec.Can CompareExchange peut-il être implémenté avec CompareAndSwap?
Il est trivial de mettre en œuvre CAS avec CompareExchange:
int CompareExchange (int* p, int expected, int newvalue);
bool CAS (int* p, int expected, int newvalue)
{
return CompareExchange (p, expected, newvalue) != expected;
}
... mais est-il possible de mettre en œuvre CompareExchange avec CAS? Toutes les tentatives que j'ai vues ont des conditions de course ou ne garantissent pas des propriétés sans clé. Je ne crois pas que ce soit possible.
Nous pensons dans le même sens ici, je ne pense pas qu'il soit possible de déterminer * p sans condition sans condition de compétition. –