【发布时间】:2016-03-29 18:51:47
【问题描述】:
据我所知,编译器和CPU都可以进行指令重排序。 通过“由 CPU 执行”,我的意思是我不关心由编译器完成的指令重新排序以及由 Store Buffer 和 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 的document,发现它通过停止 CPU 管道确保排序。
标签: multithreading memory-barriers