为什么MemoryBarrier可以通过调用xchg来实现?

Vin*_*nce 3 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*urr 5

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

\n\n
\n

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

\n\n

多处理器系统中的同步机制可能依赖于强大的内存排序模型。在这里,程序可以使用锁定指令(例如 XCHG 指令或 LOCK 前缀)来确保以原子方式执行内存上的读取-修改-写入操作。锁定操作通常像 I/O 操作一样运行,因为它们等待所有先前的指令完成并等待所有缓冲的写入耗尽到内存(请参阅第 8.1.2 节,\xe2\x80\x9cBus\n 锁定\xe2 \x80\x9d)。

\n
\n\n

从 8.1.2 开始:

\n\n
\n

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

\n\n

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

\n
\n