在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
}
}
我在“软件开发人员手册”中找不到一些资料。 请告诉我原因。
答案 0 :(得分:3)
这里发生了两件事:
编译器被赋予一个不透明的块以插入到输出指令流中。由于它不知道在块内访问了哪些数据,因此无法对其周围的其他语句进行重新排序。
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内存类型)可能不是 序列