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#的情况下保留锁定语义.聪明,绝对是我的头脑.
根据80386 说明手册,BUS LOCK在交换期间有效。此操作的前缀LOCK没有优先级,I/O 特权级别的值也没有优先级。
我的建议是,由于文档指出,BUS LOCK无论前缀是否存在LOCK,都会断言,LOCK XCHG EAX, mem否则是安全的。如有疑问,请添加LOCK.