使用xchg时我们需要mfence吗?

时间:2012-01-27 00:41:04

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

我有一个基于set xchg的装配锁。我的问题是:

使用mfence指令时,是否需要使用内存屏障(sfencelfencexchg)?

编辑:

64位平台:采用Intel nehalem

4 个答案:

答案 0 :(得分:13)

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

  

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

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

答案 1 :(得分:13)

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

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

将声明声明为volatile 添加“memory”clobber。

答案 2 :(得分:5)

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

答案 3 :(得分:0)

根据英特尔手册,

xchg指令具有隐式锁定前缀。