代码之家  ›  专栏  ›  技术社区  ›  Walter Bright

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

  •  19
  • Walter Bright  · 技术社区  · 15 年前

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

    XCHG EAX,mem
    

    或:

    LOCK XCHG EAX,mem
    

    原子交换?

    谷歌搜索这个可以得到是和否的答案。有人确切地知道这一点吗?

    3 回复  |  直到 15 年前
        1
  •  25
  •   CB Bailey    15 年前

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

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

    7.1.2.1表示:

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

    • 当执行引用内存的xchg指令时。

    同样地,

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

    XCHG:

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

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

        2
  •  12
  •   Yann Vernier    15 年前

    自386天以来,XCHG将断言锁信号,无论您是否在其上加上锁前缀。 Intel's documentation 在IA-32指令集参考N-Z中非常清楚地涵盖了这一点。

        3
  •  2
  •   Scott S. McCoy    15 年前

    根据 80386 Instruction Manual , BUS LOCK 在交换期间断言。这个 LOCK 前缀对于此操作没有优先级,并且 I/O Privilege Level .

    我的建议是,由于文件规定 总线锁 无论是否存在 前缀, LOCK XCHG EAX, mem 否则是安全的。如果有疑问,请添加 .