首页 > 解决方案 > 为什么 CAS(比较和交换)是原子的?

问题描述

我知道 CAS 是一个众所周知的原子操作。但我很难理解为什么它必须是原子的。以下面的示例代码为例。之后if (*accum == *dest),如果另一个线程跳入并成功修改了*dest第一个线程,则切换回前一个线程并继续进行*dest = newval;。这不会导致失败吗?

有什么我想念的吗?是否有某种机制可以防止上述情况发生?

任何讨论将不胜感激!

bool compare_and_swap(int *accum, int *dest, int newval)
{
  if (*accum == *dest) {
      *dest = newval;
      return true;
  } else {
      *accum = *dest;
      return false;
  }
}

标签: operating-systemcompare-and-swap

解决方案


人们经常使用非原子的示例代码来描述 CPU 用一条指令原子地做什么;因为更容易看到它是如何工作的(而且因为一条cmpxchg指令并不能告诉你它是如何工作的)。

您显示的代码就是这样(不是原子的,以帮助理解它是如何工作的)。


推荐阅读