【问题标题】:Do we need mfence when using xchg使用 xchg 时是否需要 mfence
【发布时间】:2012-02-20 02:31:57
【问题描述】:

我有一套并测试基于xchg 的程序集锁。我的问题是:

在使用xchg 指令时,我们是否需要使用内存隔离(mfencesfencelfence)?

编辑:

64 位平台:使用 Intel nehalem

【问题讨论】:

    标签: c++ c assembly x86 memory-fences


    【解决方案1】:

    正如其他答案中所说,锁定前缀在这里是隐式的,因此在汇编程序级别上没有问题。当您将其用作内联汇编程序时,问题可能出在 C(或 C++)级别。在这里,您必须确保编译器不会对您的xchg 重新排序指令。如果您使用 gcc(或表兄弟),您通常会执行以下操作:

      __asm__ __volatile__("xchgl %1, %0"
                           : "=r"(ret)
                           : "m"(*point), "0"(ret)
                           : "memory");
    

    将指令声明为易失性添加“内存”破坏。

    【讨论】:

    • 您可能应该使用"+m" 内存操作数,因为它是可读写的。不过,"memory" clobber 可能使编写输入操作数变得安全。
    【解决方案2】:

    根据英特尔 64 和 IA-32 架构软件开发人员手册第 3A 卷第 8 章 总线锁定

    内存排序模型可防止加载和存储被更早或更晚执行的锁定指令重新排序。

    所以锁定的XCHG指令充当内存屏障,不需要额外的屏障。

    【讨论】:

    • 是的,根据上述手册的第 8.1.2.2 节,XCHG 指令在引用内存时总是被锁定,即使没有为其指定 LOCK 前缀。所以上面提到的内存排序规则确实应该适用,不需要额外的屏障。
    【解决方案3】:

    没有。 xchg 保证可以编译成某种东西,这将确保硬件级别的一致性。

    【讨论】:

    • 我猜反对票来自使用“compile”而不是“assemble”或其他:经验教训:波兰我的英语。我支持内容。
    • @Daniel:根据thislock 前缀对于 xchg 是隐含的,因此对于 x86 来说并不明确需要。
    【解决方案4】:

    根据英特尔手册,xchg 指令具有隐式锁定前缀。

    【讨论】:

      猜你喜欢
      • 2019-01-29
      • 2017-03-17
      • 2014-09-14
      • 2011-03-09
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多