我正在阅读英特尔开发人员手册的Vol 3a:
并且在第245页上,这意味着只有XCHG
指令具有自动总线锁定功能。诸如XADD
和CMPXCHG
之类的指令不会自动锁定系统总线,因此您需要在LOCK
前面加上前缀。对我来说,这表明指令本身并不是跨多个CPU内核的原子。
那么,如果这些说明不是原子的,那么它们的目的是什么?
在阅读手册之前,我希望这些指令本质上在CPU级别是原子的。我认为这是结合使用“比较”和“设置”功能的原因。
编辑:
原因可能是在单个CPU内核上强制执行原子性?
编译器可以优化条件集,例如
if (n == 42) { n = 2 };
插入CMPXCHG
(没有LOCK
前缀,如果实际上更快)。
此外,CMPXCHG
在单处理器系统上是原子的,在该系统上,您仍然需要针对中断进行同步(这些中断与内核上当前正在运行的代码同时执行)。
您可以向我了解CMPXCHG
中不带LOCK
前缀的Peter Cordes's answer.的用例。