Windows 为什么MemoryBarrier可以实现为对xchg的调用?

Windows 为什么MemoryBarrier可以实现为对xchg的调用?,windows,x86,msdn,memory-barriers,Windows,X86,Msdn,Memory Barriers,在msdn上,MemoryBarrier作为对xchg的调用实现 // x86 FORCEINLINE VOID MemoryBarrier ( VOID ) { LONG Barrier; __asm { xchg Barrier, eax } } 我在“软件开发人员手册”中找不到一些资料。 请告诉我原因。这里发生了两件事: 编译器被赋予一个不透明块以插入到输出指令流中。由于它不知道在块内访问哪些数据,因此无法对其周围的其他语句重新排

在msdn上,MemoryBarrier作为对xchg的调用实现

// x86

FORCEINLINE
VOID
MemoryBarrier (
    VOID
    )
{
    LONG Barrier;
    __asm {
        xchg Barrier, eax
    }
}
我在“软件开发人员手册”中找不到一些资料。
请告诉我原因。

这里发生了两件事:

  • 编译器被赋予一个不透明块以插入到输出指令流中。由于它不知道在块内访问哪些数据,因此无法对其周围的其他语句重新排序

  • xchg
    指令执行原子读修改写操作,这需要在内存总线上排序,因此CPU强制执行内存屏障


  • 摘自《英特尔64和IA-32体系结构软件开发人员手册》第3卷:“系统编程指南”

    8.2.5“加强或削弱内存排序模型”

    多处理器系统中的同步机制可能取决于 基于强记忆排序模型。在这里,程序可以使用锁 指令,如XCHG指令或锁前缀,以确保 在内存上执行读修改写操作 原子的。锁定操作通常与I/O操作类似 在该中,他们等待前面的所有指示完成并等待 所有缓冲写入到内存的漏极(参见第8.1.2节“总线 锁定”)

    从8.1.2开始:

    锁定操作是相对于所有其他内存的原子操作 操作和所有外部可见事件仅获取指令 页表访问可以传递锁定的指令。锁定 指令可用于同步由一个处理器写入的数据 并由另一个处理器读取。

    对于P6系列处理器,锁定操作序列化所有 未完成的加载和存储操作(即,等待它们 完成)。对于奔腾4和英特尔至强,这一规则同样适用 处理器,只有一个例外。加载弱引用的操作 有序内存类型(如WC内存类型)可能不可用 连载


    带有内存操作数的
    xchg
    具有隐式
    。上锁的指令是篱笆。