在本文:无锁数据结构(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 的情况如何,即使它的更改已被该演员覆盖?如果这不可能发生,那为什么呢?
我想相信作者,所以我在这里错过了什么?我想这一定很明显。如果这看起来微不足道,我提前道歉。