我有一个基于set xchg
的装配锁。我的问题是:
使用mfence
指令时,是否需要使用内存屏障(sfence
,lfence
或xchg
)?
编辑:
64位平台:采用Intel nehalem
答案 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指令具有隐式锁定前缀。