作为内存栅栏的必要性以确保并行程序执行的正确性的经典示例,经常给出以下示例:
P1:
x = 42; //line 1
flag = true; //line 2
P2:
while(!flag);
y = x;
一方面,为了获得最佳性能,处理器尝试(合法地)重新排序指令,以使重新排序的指令序列在考虑顺序执行时具有与原始指令完全相同的效果。另一方面,为了保证顺序执行指令序列的正确性,必须尊重控制依赖。从这个角度来看,P2执行的while语句不就是一个控制依赖吗?如果是这样,那么唯一需要的内存栅栏是 P1 的第 1 行和第 2 行之间的 Store|Store 栅栏,对吗?