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页上,这意味着只有
那么,如果这些说明不是原子的,那么它们的目的是什么呢?
在阅读手册之前,我希望这些说明本质上在CPU级别上是原子性的。我认为这是结合“比较”和“设置”功能的原因。
编辑:
原因可能是在单个CPU内核上强制执行原子性???
如果实际上更快,则将其转换为
此外,
您可以向我了解有关Peter Cordes's answer.中没有
(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
指令具有自动总线锁定功能。诸如XADD
和CMPXCHG
之类的指令不会自动锁定系统总线,为此,您需要在LOCK
前面加上前缀。对我来说,这表明指令本身并不是跨多个CPU内核的原子。那么,如果这些说明不是原子的,那么它们的目的是什么呢?
在阅读手册之前,我希望这些说明本质上在CPU级别上是原子性的。我认为这是结合“比较”和“设置”功能的原因。
编辑:
原因可能是在单个CPU内核上强制执行原子性???
最佳答案
编译器可以优化条件集,例如
if (n == 42) { n = 2 };
如果实际上更快,则将其转换为
CMPXCHG
(不带LOCK
前缀)。此外,
CMPXCHG
在单处理器系统上是原子的,在该系统上,您仍然需要针对中断进行同步(该中断可以在任意两条指令之间触发,但不能在内核的一条指令中间触发)。您可以向我了解有关Peter Cordes's answer.中没有
CMPXCHG
前缀的LOCK
用例的信息10-08 06:16