В этом документе: Структуры данных без блокировки ( pdf ) показан следующий фундаментальный принцип «Сравнить и поменять»:
template <class T>
bool CAS(T* addr, T exp, T val)
{
if (*addr == exp)
{
*addr = val;
return true;
}
return false;
}
А потом говорит
Вся процедура атомарна
Но как это так? Разве не возможно, чтобы какой-то другой актер мог изменить значение addr
между if
и назначением? В этом случае, предполагая, что весь код использует этот фундаментальный CAS, в следующий раз будет обнаружено, что что-то «ожидало», что это будет определенный путь, и это не так. Тем не менее, это не меняет того факта, что это может произойти, и в этом случае оно все еще атомное? Как насчет другого актера, возвращающего true, даже если его изменения были перезаписаны этим актером? Если это не может произойти, то почему?
Я хочу верить автору, так чего мне здесь не хватает? Я думаю, это должно быть очевидно. Заранее извиняюсь, если это кажется тривиальным.