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

时间:2013-10-29 08:10:02

标签: windows x86 msdn memory-barriers

在msdn http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208(v=vs.85).aspx上,MemoryBarrier实现为对xchg的调用。

// x86

FORCEINLINE
VOID
MemoryBarrier (
    VOID
    )
{
    LONG Barrier;
    __asm {
        xchg Barrier, eax
    }
}

我在“软件开发人员手册”中找不到一些资料。 请告诉我原因。

2 个答案:

答案 0 :(得分:3)

这里发生了两件事:

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

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

答案 1 :(得分:3)

来自Intel 64和IA-32架构软件开发人员手册,第3卷:“系统编程指南”

  

8.2.5“强化或弱化记忆订购模式”

     

多处理器系统中的同步机制可能取决于   基于强大的内存排序模型。这里,程序可以使用锁定   诸如XCHG指令或LOCK前缀之类的指令以确保   对存储器执行读 - 修改 - 写操作   原子。锁定操作通常像I / O操作一样操作   在那个他们等待所有以前的指令完成和   所有缓冲写入耗尽内存(见第8.1.2节“总线   锁定”)。

从8.1.2开始:

  

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

     

对于P6系列处理器,锁定操作序列化全部   出色的加载和存储操作(即等待它们   完成)即可。对于Pentium 4和Intel Xeon,此规则也适用   处理器,但有一个例外。加载弱引用的操作   有序的内存类型(例如WC内存类型)可能不是   序列