Multithreading 在多核x86上,是否需要一个锁作为XCHG的前缀?

Multithreading 在多核x86上,是否需要一个锁作为XCHG的前缀?,multithreading,x86,atomicity,Multithreading,X86,Atomicity,如果mem是共享内存位置,我是否需要: XCHG EAX,mem 或: 以原子方式进行交换 用谷歌搜索这个问题会得到肯定和否定的答案。有人确切地知道这一点吗?根据,在交换期间,总线锁被断言。LOCK前缀对此操作没有优先权,并且的值也没有优先权 我的建议是,由于文档说明无论是否存在LOCK前缀,LOCK XCHG EAX,mem都是安全的。如果有疑问,请添加一个锁,从386天开始,无论您是否在锁上加上锁前缀,xchg都将断言锁信号。IA-32指令集参考N-Z中非常清楚地介绍了这一点。英特尔的文档

如果
mem
是共享内存位置,我是否需要:

XCHG EAX,mem
或:

以原子方式进行交换

用谷歌搜索这个问题会得到肯定和否定的答案。有人确切地知道这一点吗?

根据,在交换期间,
总线锁被断言。
LOCK
前缀对此操作没有优先权,并且的值也没有优先权


我的建议是,由于文档说明无论是否存在
LOCK
前缀,
LOCK XCHG EAX,mem
都是安全的。如果有疑问,请添加一个

,从386天开始,无论您是否在锁上加上锁前缀,xchg都将断言锁信号。IA-32指令集参考N-Z中非常清楚地介绍了这一点。

英特尔的文档似乎非常清楚它是多余的

IA-32英特尔体系结构 软件开发人员手册 第3A卷: 系统编程指南,第1部分

7.1.2.1表示:

处理器自动遵循锁语义的操作如下 如下:

  • 执行引用内存的XCHG指令时
同样地

英特尔®64和IA-32体系结构 软件开发人员手册 第2B卷: 指令集参考,N-Z

XCHG:

如果引用内存操作数,处理器的锁定协议将自动 在exchange操作期间实施,无论是否存在锁前缀或IOPL值


请注意,这实际上并不意味着无论是否使用锁前缀,都会断言锁信号,7.1.4描述了如果缓存内存位置,在以后的处理器上如何在没有锁的情况下保留锁语义。聪明,而且绝对超出我的理解。

Oracle Hotspot JVM上的PrintAssembly选项似乎也同意这一点。生成程序集时,x86-64上的xchg指令上没有锁定前缀。在当前版本的手册中,该部分是
8.1.2.1自动锁定
,而不是7.1.2.1。
LOCK XCHG EAX,mem