9

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

使用指令时是否需要使用内存围栏(mfencesfencelfencexchg

编辑 :

64 位平台:采用 Intel nehalem

4

4 回答 4

16

根据Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A 的第8 章总线锁定

内存排序模型防止加载和存储被更早或更晚执行的锁定指令重新排序。

所以锁定XCHG指令充当内存屏障,不需要额外的屏障。

于 2012-01-27T00:58:11.653 回答
16

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

  __asm__ __volatile__("xchgl %1, %0"
                       : "=r"(ret)
                       : "m"(*point), "0"(ret)
                       : "memory");

那就是将指令声明为易失性添加“内存”破坏者。

于 2012-01-27T07:29:37.407 回答
5

No.xchg保证可以编译成一些东西,这将确保硬件级别的一致性。

于 2012-01-27T00:43:29.740 回答
0

根据英特尔手册,xchg 指令具有隐式锁定前缀。

于 2012-01-27T07:48:43.337 回答