【问题标题】:Why we need lock prefix before CMPXCHG [duplicate]为什么我们在 CMPXCHG 之前需要锁定前缀 [重复]
【发布时间】:2013-06-10 08:53:47
【问题描述】:

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

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

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

【问题讨论】:

  • @Evan Carroll 为什么这个问题在另一个问题之前被问到是重复的
  • 因为我评估质量、受欢迎程度和贡献,而另一个问题的形式更好,更受欢迎,并且彼得科德斯的答案相当于黄金。首先提出问题是巨大的,但它不是 100%(如果是这样,我们就不会被允许将旧问题复制到新问题上)。不过我确实给了你一个赞成票=)

标签: assembly parallel-processing x86 compare-and-swap


【解决方案1】:
  • CMXCHG 只有在前缀为 LOCK 时才在多处理器系统上是真正的原子(断言总线锁)。现在正在使用基于侦听的缓存一致性协议,这消除了对栅栏(总线锁)的需求。
  • 进入问题的第二部分(无论如何都会更改值)。是的,在这种情况下,CMPXCHG 指令会失败,但对于所有处理器来说仍然是原子的。

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

【讨论】:

    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 2013-05-14
    • 2014-03-08
    • 2023-03-03
    • 1970-01-01
    • 2011-07-11
    • 2013-07-07
    • 1970-01-01
    相关资源
    最近更新 更多