我有一套基于测试xchg
的装配锁。我的问题是:
使用指令时是否需要使用内存围栏(mfence
或sfence
)lfence
?xchg
编辑 :
64 位平台:采用 Intel nehalem
我有一套基于测试xchg
的装配锁。我的问题是:
使用指令时是否需要使用内存围栏(mfence
或sfence
)lfence
?xchg
编辑 :
64 位平台:采用 Intel nehalem
根据Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A 的第8 章总线锁定
内存排序模型防止加载和存储被更早或更晚执行的锁定指令重新排序。
所以锁定XCHG
指令充当内存屏障,不需要额外的屏障。
正如其他答案中所说,锁定前缀在这里是隐式的,因此在汇编程序级别上没有问题。当您将其用作内联汇编程序时,问题可能出在 C(或 C++)级别。在这里,您必须确保编译器不会对您的xchg
. 如果您使用 gcc(或表兄弟),您通常会执行以下操作:
__asm__ __volatile__("xchgl %1, %0"
: "=r"(ret)
: "m"(*point), "0"(ret)
: "memory");
那就是将指令声明为易失性并添加“内存”破坏者。
No.xchg
保证可以编译成一些东西,这将确保硬件级别的一致性。
根据英特尔手册,xchg 指令具有隐式锁定前缀。