【发布时间】:2017-07-31 13:47:43
【问题描述】:
我试图准确地理解什么是内存屏障。
根据我目前所知,内存屏障(例如:mfence)用于防止指令从前到后和从后到前的重新排序。
这是一个正在使用的内存屏障的示例:
instruction 1
instruction 2
instruction 3
mfence
instruction 4
instruction 5
instruction 6
现在我的问题是:mfence 指令是否只是一个标记,告诉 CPU 以什么顺序执行指令?还是 CPU 像执行其他指令一样实际执行的指令(例如:mov)。
【问题讨论】:
-
这是CPU执行的指令,没有其他指令。
-
请注意,像
std::atomic_signal_fence()或GNU Casm("":::"memory")这样的编译器 内存屏障纯粹是源代码中的标记,并且编译为零指令。它们的存在是为了在编译时阻止重新排序,并且在目标架构具有比源语言更强的内存模型时特别有用(例如 C++ -> x86 asm)。 preshing.com/20120625/memory-ordering-at-compile-time 解释更多。 -
我想知道你对这笔赏金的期望。你得到的答案很明确。如果您还有其他问题,请务必实际说明!没有人能猜出答案的哪一部分让你不满意。
-
请注意,您在“指令”和“标记”之间建立了一种可能错误的二分法。为什么不能两者兼而有之?是的,无可否认,它是一个指令,但为什么不能它是一个主要用作标记的指令?
标签: assembly x86 cpu-architecture memory-barriers memory-fences