据我所知,编译器和CPU都可以进行指令重排序。 通过“由CPU执行”,我的意思是我不关心由编译器完成的指令重新排序以及由存储缓冲区和CPU缓存引起的重新排序。 对于由 Store Buffer 和 CPU Cache 引起的重新排序,这在this中讨论过。论文中,我已经了解了内存屏障如何抑制这种重新排序(内存重新排序)。
我关心的是这样的重新排序:
源代码:
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
所以我的问题是:内存屏障如何抑制指令重新排序?
最佳答案
@Tsyvarev 是正确的,它是特定于处理器(或处理器系列)的。 例如,在 ARM 下,DMB(内存屏障)会导致 CPU 管道停顿以确保排序(防止重新排序),如其 documentation说:
Figure 1 shows the DMB instruction being used to ensure memory ordering by stalling the pipeline
关于multithreading - 内存屏障/栅栏如何抑制 CPU 执行的指令重新排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34433941/