“记忆排序服从因果关系”是什么意思?

new*_*ris 6 x86 memory-model

我对多处理器编程很陌生。

在关于 x86 内存模型的文章中

在多处理器系统中,内存排序服从因果关系(内存排序尊重传递可见性)。

请帮忙

Ker*_* SB 5

服从因果关系意味着如果事情A导致另一件事B,并且如果您观察到B发生了,那么您也会观察到A发生了。考虑以下代码:

x = 0
y = 0

thread 1        thread 2

  x = 10          r1 = y   // #1
  y = 25          r2 = x   // #2
Run Code Online (Sandbox Code Playgroud)

假设所有的读取和写入都是单独正确的(即在指令级别是原子的,没有撕裂,例如通过在 C++ 中使用宽松的原子),考虑线程 2 在点 2 对世界的看法#1

  • 如果r1为零,那么我们一无所知。线程 1 的执行可以在任何地方;它可能尚未开始,或者可能已经完成,但更改尚不可见。

  • 然而,如果r1是 25,那么根据因果关系我们知道它r2 必须读为 10,因为唯一r1能读到 25 的方法是线程 1 已经执行了这两个语句,而 x86 的强内存排序保证了之前的效果(因果前面)商店是可见的。

请注意,这不是所有硬件的通用功能。在流行的当代内存模型(如 C++11、C11、Java 和 Go 的模型)中,我们会说在上面的操作中,存储y = 25有“释放排序”,加载r1 = y有“获取排序”,而这两个操作“同步”。