如果mem
是共享内存位置,我是否需要:
XCHG EAX,mem
或:
LOCK XCHG EAX,mem
以原子方式进行交换?
谷歌搜索这会产生是和否答案。有没有人知道这个?
答案 0 :(得分:25)
英特尔的文档似乎很清楚它是多余的。
IA-32英特尔®架构 软件开发人员手册 第3A卷: 系统编程指南,第1部分
7.1.2.1说:
处理器自动遵循LOCK语义的操作如下 如下:
- 执行引用内存的XCHG指令时。
类似地,
英特尔®64和IA-32架构 软件开发人员手册 第2B卷: 指令集参考,N-Z
XCHG:
如果引用了内存操作数,则会自动执行处理器的锁定协议 无论是否存在LOCK前缀或IOPL的值,都会在交换操作期间实施。
注意,这实际上并不意味着无论是否使用LOCK前缀都会声明LOCK#信号,7.1.4描述了如果内存位置被缓存,后续处理器如何在没有LOCK#的情况下保留锁定语义。聪明,绝对是我的头脑。
答案 1 :(得分:12)
从386天开始,无论你是否在其上加上锁定前缀,xchg都会断言锁定信号。 Intel's documentation在IA-32指令集参考N-Z中非常清楚地涵盖了这一点。
答案 2 :(得分:2)
根据80386 Instruction Manual,BUS LOCK
在交换期间被声明。 LOCK
前缀没有此操作的优先级,I/O Privilege Level的值也没有。
我的建议是,由于文档声明BUS LOCK
无论LOCK
前缀是否存在都被声明,因此LOCK XCHG EAX, mem
是安全的。如有疑问,请添加LOCK
。