Предполагая, что CompareAndSwap (или CAS) никогда не завершается сбоем, может ли CompareExchange быть реализован с CAS?
CompareExchange принимает указатель, ожидаемое значение и новое значение и атомарно устанавливает в памяти, на которую ссылается указатель, новое значение, если оно соответствует ожидаемому значению. Разница между ними заключается в том, что CompareExchange возвращает предыдущее значение области памяти, а CompareAndSwap возвращает логическое значение, указывающее успех или неудачу.
Реализовать CAS с CompareExchange тривиально:
int CompareExchange (int* p, int expected, int newvalue);
bool CAS (int* p, int expected, int newvalue)
{
return CompareExchange (p, expected, newvalue) != expected;
}
... но возможно ли реализовать CompareExchange с CAS? Все попытки, которые я видел, либо имеют условия гонки, либо не гарантируют свойства без блокировки. Я не верю, что это возможно.