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

(3 个回答)


2年前关闭。




为什么我们需要在英特尔架构中的 CMPXCHG 之前加锁前缀。
请参阅以供引用
http://courses.engr.illinois.edu/ece390/archive/spr2002/books/labmanual/inst-ref-cmpxchg.html

我不确定如果不使用锁会有什么后果。因为在将值加载到 eax 和执行 LOCK CMPXCHG 之间,可以更改值而不考虑锁定前缀,因为将值加载到 eax 和 LOCK CMPXCHG 是两条指令。

意思是说,如果我不使用 CMPXCHG,可能发生的最糟糕的事情是我必须再次旋转。

最佳答案

  • CMXCHG 仅在多处理器系统上以 LOCK 为前缀时才是真正的原子(断言总线锁定)。目前正在使用基于监听的缓存一致性协议(protocol),这消除了对栅栏(总线锁)的需要。
  • 来到问题的第二部分(值无论如何都会改变)。 YES 在这种情况下 CMPXCHG 指令失败,但对于所有处理器仍然是原子的。

  • 底线 :锁定前缀使 CMPXCHG 成为多处理器屏障指令。

    10-08 17:46