我知道现代CPU可以乱序执行,但是它们总是按照顺序退役结果,就像维基百科所描述的那样。
"乱序处理器用其他准备好的指令填补这些时间段,然后在最后重新排序结果,使其看起来像正常处理的指令一样。"
现在,在使用多核平台时,需要使用内存栅栏,因为由于乱序执行,这里可能会打印出错误的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,对吗?我知道在乱序执行过程中,它可能已经修改了f,但它肯定在x之前未被撤回,对吗?
现在,有了按顺序撤销结果和缓存一致性机制,为什么您需要在x86中使用内存障碍呢?