Multithreading 内存屏障/围栏如何抑制CPU执行的指令重新排序?

Multithreading 内存屏障/围栏如何抑制CPU执行的指令重新排序?,multithreading,memory-barriers,Multithreading,Memory Barriers,据我所知,编译器和CPU都可以执行指令重新排序。 所谓“由CPU执行”,我的意思是我不关心由编译器完成的指令重新排序以及由存储缓冲区和CPU缓存引起的重新排序。 对于本文讨论的存储缓冲区和CPU缓存引起的重新排序,我已经了解了内存屏障如何抑制这种重新排序(内存重新排序) 我关心的是这样的重新排序: 源代码: data=1; //statement1 ready=true;//statement2 data=1; //statement1 smp_wb();//Insert a write ba

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

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

源代码:

data=1; //statement1
ready=true;//statement2
data=1; //statement1
smp_wb();//Insert a write barrier here!
ready=true;//statement2
但是,在CPU0上运行的ThreadA按以下顺序执行上述代码:

ready=true;//statement2
data=1; //statement1
也就是说,CPU对指令进行重新排序,这导致实际执行顺序与源代码指定的顺序不同。 正如我们所知,如果我们想保持源代码的顺序,我们可以求助于内存屏障(或围栏),如:

新的源代码:

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

因此,我的问题来了:内存障碍如何抑制这里的指令重新排序?

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

图1显示了用于确保内存的DMB指令 通过暂停管道订购


如果您询问关于内存屏障的实现,那么这个实现是特定于编译器和特定于体系结构的。您需要选择具体的编译器(和编程语言),并查看其关于内存障碍的文档。通过类比,您需要选择特定的处理器(或系列),并查看其关于屏障的规范。如果你不能理解其中一些资源,你可以问更具体的问题。谢谢@Tsyvarev。我查看了ARM,发现它通过暂停CPU管道来确保订购。