因果一致性与顺序一致性有何不同?

goo*_*ing 6 c java algorithm concurrency memory-model

我知道在顺序一致性中,所有进程都必须按顺序处理.例如:

Process 1     Process 2
x = 1         z = 5
y = 2         p = 3
Run Code Online (Sandbox Code Playgroud)

因此,我们可以得到x = 1,z = 5,y = 2,p = 3或z = 5,p = 3,x = 1,y = 2.但重要的是p只能在z执行后执行等,对吗?

因果一致性怎么样?我没有看到任何差异.任何草图,或JAVA或C中的代码都会很棒.谢谢.

Wan*_*gic 5

顺序一致性方面,所有内存操作对所有节点似乎都是以某种顺序出现的。

因此,在您的示例中,进程1、2 和3都将以相同的顺序看到内存操作。(这4个操作有6个可能的顺序,但是所有过程都会就该顺序达成一致。)

因果一致性过程中,1、2和3都可以观察到这些写入以不同顺序发生。有两个规则:

  1. 每个人都同意我写的过程以我执行它们的过程相同的顺序发生。
  2. 如果有任何进程i读取某个位置x并获得了由不同进程j写入的值,则所有线程都同意进程j对位置x的写操作在进程i读取位置x之前。

由于在您的原始示例中没有读取操作,因此,例如,进程1可能认为写入按顺序发生,x=1, y=2, z=5, p=3而进程2认为写入是按顺序发生,z=5, p=3, x=1, y=2而进程3则认为发生在顺序中订购z=5, x=1, p=3, y=2

Wikipedia页面指向论文提供了一些更有趣的示例(涉及阅读)。

因果记忆本身似乎不是很有用。在本文的后面,他们展示了如何使用因果记忆(和辅助过程)来实现某种类似于屏障的方法,但是提到了似乎没有任何便捷的方法来实现关键部分。

因此,他们最终会执行弱一致性释放一致性内存的操作,并添加需要顺序一致的同步原语。