This question already has answers here:
Is x86 CMPXCHG atomic, if so why does it need LOCK?

(3个答案)


2年前关闭。




我正在阅读英特尔开发人员手册的第3a卷:

http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html

在第245页上,这意味着只有XCHG指令具有自动总线锁定功能。诸如XADDCMPXCHG之类的指令不会自动锁定系统总线,为此,您需要在LOCK前面加上前缀。对我来说,这表明指令本身并不是跨多个CPU内核的原子。

那么,如果这些说明不是原子的,那么它们的目的是什么呢?

在阅读手册之前,我希望这些说明本质上在CPU级别上是原子性的。我认为这是结合“比较”和“设置”功能的原因。

编辑:

原因可能是在单个CPU内核上强制执行原子性???

最佳答案

编译器可以优化条件集,例如

if (n == 42) { n = 2 };

如果实际上更快,则将其转换为CMPXCHG(不带LOCK前缀)。

此外,CMPXCHG在单处理器系统上是原子的,在该系统上,您仍然需要针对中断进行同步(该中断可以在任意两条指令之间触发,但不能在内核的一条指令中间触发)。

您可以向我了解有关Peter Cordes's answer.中没有CMPXCHG前缀的LOCK用例的信息

10-08 06:16