在多核x86上,是否需要作为XCHG前缀的LOCK?

Wal*_*ght 19 x86 multithreading atomicity

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

XCHG EAX,mem
Run Code Online (Sandbox Code Playgroud)

要么:

LOCK XCHG EAX,mem
Run Code Online (Sandbox Code Playgroud)

原子地进行交换?

谷歌搜索这会产生是和否答案.有没有人知道这个?

CB *_*ley 25

英特尔的文档似乎很清楚它是多余的.

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

7.1.2.1说:

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

  • 执行引用内存的XCHG指令时.

同样的,

英特尔®64和IA-32架构软件开发人员手册卷2B:指令集参考,NZ

XCHG:

如果引用了内存操作数,则无论是否存在LOCK前缀或IOPL的值,处理器的锁定协议都会在交换操作期间自动实现.

请注意,这实际上并不意味着无论是否使用LOCK前缀都会声明LOCK#信号,7.1.4描述了如果内存位置被缓存,后续处理器如何在没有LOCK#的情况下保留锁定语义.聪明,绝对是我的头脑.

  • “缓存锁”的想法是,虽然该核心拥有缓存行的独占所有权 (MESI),但它对该行所做的所有操作也可能是来自系统中尊重缓存一致性的其他所有内容的 PoV 的单个原子事务,即一切。因此,核心只需延迟响应 MESI 共享,并使原子 RMW 指令的加载和存储操作之间的该线路的请求无效。(并且由于 x86 强大的内存排序规则,只有在使早期加载+存储可见等之后才执行此操作,因此这是一个完整的障碍。) (2认同)

Yan*_*ier 12

从386天开始,xchg将断言Lock信号,无论你是否在其上放置了锁定前缀.英特尔的文档在IA-32指令集参考NZ中非常清楚地涵盖了这一点.


Sco*_*Coy 5

根据80386 说明手册BUS LOCK在交换期间有效。此操作的前缀LOCK没有优先级,I/O 特权级别的值也没有优先级。

我的建议是,由于文档指出,BUS LOCK无论前缀是否存在LOCK,都会断言,LOCK XCHG EAX, mem否则是安全的。如有疑问,请添加LOCK.