当我们使用xchg时,我们是否需要防护

问题描述:

我有一套基于测试xchg的程序集锁。我的问题是:当我们使用xchg时,我们是否需要防护

当使用xchg指令时,我们是否需要使用内存屏蔽(mfence,sfencelfence)?

编辑:

64位平台:英特尔的Nehalem

+1

什么平台/ CPU? – 2012-01-27 00:51:06

正如其他答案中所说,锁前缀是隐含的,因此在汇编器级别上没有问题。当你使用它作为内联汇编程序时,问题可能依赖于C(或C++)级别。在这里你必须确保编译器不会对你的xchg重新排序。如果你正在使用gcc(或表兄弟),你通常会做这样的事情:

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

即申报指令挥发性添加“记忆”撞。

+4

+1为“记忆”clobber。 – 2012-01-27 17:53:10

xchg号保证编译成的东西,这将确保硬件级别上的一致性。

+0

我猜downvote来自使用“编译”而不是“汇编”或其他:经验教训:波兰语我的英语。尽管如此,我仍然坚持内容。 – 2012-01-27 00:47:11

+0

假设您使用LOCK前缀,当然。 – 2012-01-27 01:19:52

+8

@Daniel:根据[this](http://*.com/questions/3144335/on-a-multicore-x86-is-a-lock-necessary-as-a-prefix-to-xchg) lock'前缀对于'xchg'是隐含的,因此对于x86并不明确。 – Grizzly 2012-01-27 01:29:46

根据第8章总线锁定,所述英特尔64和IA-32体系结构软件开发者手册,卷3A的

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

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

+1

是的,根据上述手册第8.1.2.2节的规定,即使没有指定LOCK前缀,“XCHG”指令在引用内存时总是被锁定。所以上面提到的内存排序规则的确适用,并且不需要额外的屏障。 – Eugene 2012-01-28 08:55:41

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