【发布时间】:2019-01-29 05:55:30
【问题描述】:
我已经看过 this answer 和 this answer,但在假设没有非临时指令的情况下,似乎都没有明确和明确地说明 mfence 和 xchg 的等价或不等价。
xchg 的 Intel instruction reference 提到 此指令对于实现信号量或类似的进程同步数据结构很有用,并进一步参考了 Volume 3A 的第 8 章。该参考说明如下。
对于 P6 系列处理器,锁定操作将所有 未完成的加载和存储操作(即等待它们 完全的)。此规则也适用于 Pentium 4 和 Intel Xeon 处理器,但有一个例外。加载弱引用的操作 有序内存类型(如 WC 内存类型)可能不是 序列化。
mfence 文档声明如下。
对所有从内存加载和 在 MFENCE 之前发出的存储到内存指令 操作说明。这种序列化操作保证了每次加载和 存储程序中 MFENCE 指令之前的指令 order 在任何加载或存储指令之前变得全局可见 遵循 MFENCE 指令。 1 MFENCE 指令是 订购关于所有加载和存储指令,其他 MFENCE 指令,任何 LFENCE 和 SFENCE 指令,以及任何序列化 指令(例如 CPUID 指令)。 MFENCE 不 序列化指令流。
如果我们忽略弱排序的内存类型,xchg(暗示lock)是否包含 mfence 关于内存排序的所有保证?
【问题讨论】:
标签: multithreading assembly x86 intel memory-barriers