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

时间:2010-06-29 20:08:15

标签: multithreading x86 atomicity

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

XCHG EAX,mem

或:

LOCK XCHG EAX,mem

以原子方式进行交换?

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

3 个答案:

答案 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 ManualBUS LOCK在交换期间被声明。 LOCK前缀没有此操作的优先级,I/O Privilege Level的值也没有。

我的建议是,由于文档声明BUS LOCK无论LOCK前缀是否存在都被声明,因此LOCK XCHG EAX, mem是安全的。如有疑问,请添加LOCK