使用xchg时我们需要mfence吗?
我有一个基于xchg
的assembly和测试assembly锁。 我的问题是:
使用xchg
指令时是否需要使用内存防护( mfence
, sfence
或lfence
)?
编辑:
64位平台:采用Intel nehalem
正如在其他答案中所说,锁定前缀是隐含的,这里,因此在汇编程序级别上没有问题。 当您将其用作内联汇编程序时,问题可能在于C(或C ++)级别。 在这里,您必须确保编译器不会重新排序与xchg
指令。 如果您正在使用gcc(或表兄弟),您通常会执行以下操作:
__asm__ __volatile__("xchgl %1, %0" : "=r"(ret) : "m"(*point), "0"(ret) : "memory");
这是将指令声明为volatile 并添加“memory”clobber。
根据英特尔64和IA-32架构软件开发人员手册第3A卷第8章总线锁定
内存排序模型可防止使用先前或稍后执行的锁定指令重新排序加载和存储。
因此,锁定的XCHG
指令充当存储器屏障,并且不需要额外的屏障。
不, xchg
保证可以编译成某种东西,这将确保硬件级别的一致性。
根据英特尔手册,xchg指令具有隐式锁定前缀。