我知道现代 CPU 可以乱序执行,但是它们总是按顺序退出结果,如 wikipedia 所述。
“Out of Oder 处理器及时用其他准备好的指令填充这些“插槽”,然后在最后对结果重新排序,以使指令看起来像正常处理。
现在据说在使用多核平台时需要内存栅栏,因为由于乱序执行,可以在此处打印错误的x值。
Processor #1:
while f == 0
;
print x; // x might not be 42 here
Processor #2:
x = 42;
// Memory fence required here
f = 1
现在我的问题是,由于乱序处理器(我假设多核处理器的核心)总是按顺序退出结果,那么内存栅栏的必要性是什么。多核处理器的内核是否只看到从其他内核退出的结果,或者它们也看到正在进行的结果?
我的意思是在我上面给出的示例中,当处理器 2 最终将退出结果时,x的结果应该在f之前,对吗?我知道在乱序执行期间,它可能在x之前修改了f ,但它一定没有在x之前退休,对吧?
现在有了按顺序退出结果和缓存一致性机制,为什么在 x86 中还需要内存栅栏?