使用xchg时我们需要mfence吗?

Jay*_*y D 8 c c++ x86 assembly memory-fences

我有一套xchg基于测试的装配锁.我的问题是:

使用指令时是否需要使用内存防护(mfence,sfencelfence)xchg

编辑:

64位平台:采用Intel nehalem

mar*_*kgz 13

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

内存排序模型可防止使用先前或稍后执行的锁定指令重新排序加载和存储.

因此,锁定的XCHG指令充当存储器屏障,并且不需要额外的屏障.


Jen*_*edt 13

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

  __asm__ __volatile__("xchgl %1, %0"
                       : "=r"(ret)
                       : "m"(*point), "0"(ret)
                       : "memory");
Run Code Online (Sandbox Code Playgroud)

这是将指令声明为volatile 添加"memory"clobber.


Eug*_*eck 5

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

  • @Daniel:根据[this](http://stackoverflow.com/questions/3144335/on-a-multicore-x86-is-a-lock-necessary-as-a-prefix-to-xchg)`lock `前缀对于`xchg`是隐式的,因此x86不需要显式. (9认同)