【发布时间】:2012-02-20 02:31:57
【问题描述】:
我有一套并测试基于xchg 的程序集锁。我的问题是:
在使用xchg 指令时,我们是否需要使用内存隔离(mfence、sfence 或lfence)?
编辑:
64 位平台:使用 Intel nehalem
【问题讨论】:
标签: c++ c assembly x86 memory-fences
我有一套并测试基于xchg 的程序集锁。我的问题是:
在使用xchg 指令时,我们是否需要使用内存隔离(mfence、sfence 或lfence)?
编辑:
64 位平台:使用 Intel nehalem
【问题讨论】:
标签: c++ c assembly x86 memory-fences
正如其他答案中所说,锁定前缀在这里是隐式的,因此在汇编程序级别上没有问题。当您将其用作内联汇编程序时,问题可能出在 C(或 C++)级别。在这里,您必须确保编译器不会对您的xchg 重新排序指令。如果您使用 gcc(或表兄弟),您通常会执行以下操作:
__asm__ __volatile__("xchgl %1, %0"
: "=r"(ret)
: "m"(*point), "0"(ret)
: "memory");
将指令声明为易失性并添加“内存”破坏。
【讨论】:
"+m" 内存操作数,因为它是可读写的。不过,"memory" clobber 可能使编写输入操作数变得安全。
根据英特尔 64 和 IA-32 架构软件开发人员手册第 3A 卷第 8 章 总线锁定
内存排序模型可防止加载和存储被更早或更晚执行的锁定指令重新排序。
所以锁定的XCHG指令充当内存屏障,不需要额外的屏障。
【讨论】:
XCHG 指令在引用内存时总是被锁定,即使没有为其指定 LOCK 前缀。所以上面提到的内存排序规则确实应该适用,不需要额外的屏障。
没有。 xchg 保证可以编译成某种东西,这将确保硬件级别的一致性。
【讨论】:
lock 前缀对于 xchg 是隐含的,因此对于 x86 来说并不明确需要。
根据英特尔手册,xchg 指令具有隐式锁定前缀。
【讨论】: