Структуры данных без блокировок в C ++ Сравнение и замена процедур - PullRequest
3 голосов
/ 28 апреля 2010

В этом документе: Структуры данных без блокировки ( 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, даже если его изменения были перезаписаны этим актером? Если это не может произойти, то почему?

Я хочу верить автору, так чего мне здесь не хватает? Я думаю, это должно быть очевидно. Заранее извиняюсь, если это кажется тривиальным.

1 Ответ

8 голосов
/ 28 апреля 2010

Он описывает атомарную операцию, которая дается реализацией "как-то". Это псевдокод для чего-то реализованного в оборудовании.

...