内存屏障/围栏如何禁止CPU执行指令重新排序?

时间:2015-12-23 10:48:41

标签: multithreading memory-barriers

据我所知,编译器和CPU都可以执行指令重新排序。 通过'由CPU执行',我的意思是我不关心由编译器完成的指令重新排序以及由存储缓冲区和CPU缓存引起的重新排序。 对于由this论文中讨论的存储缓冲区和CPU缓存引起的重新排序,我已经理解了内存屏障如何抑制这种重新排序(内存重新排序)。

我关心的是这样的重新排序:

源代码:

data=1; //statement1
ready=true;//statement2

但是,在CPU0上运行的ThreadA按以下顺序执行上述代码:

ready=true;//statement2
data=1; //statement1

也就是说CPU重新排序指令,这导致实际执行顺序与源代码指定的顺序不同。 我们知道,如果我们想保留源代码的顺序,我们可以采用内存屏障(或栅栏),如:

新源代码:

data=1; //statement1
smp_wb();//Insert a write barrier here!
ready=true;//statement2

所以我的问题出现了:内存屏障如何抑制指令重新排序?

1 个答案:

答案 0 :(得分:2)

@Tsyvarev是正确的,它是特定的处理器(或处理器系列)。 例如,在ARM下,DMB(内存屏障)导致CPU管道停顿,以确保排序(防止重新排序),正如其documentation所说:

  

图1显示了用于确保内存的DMB指令   通过停止管道排序