我了解在顺序一致性中,所有流程都必须按顺序处理。例如:
Process 1 Process 2
x = 1 z = 5
y = 2 p = 3
因此,我们可以得到 x=1, z=5, y=2, p=3 或 z=5, p=3, x=1, y=2。但重要的是 p 只能在 z 执行后执行等等,对吗?
因果一致性如何?我看不出有什么区别。 JAVA 或 C 中的任何草图或代码都很棒。谢谢。
最佳答案
在顺序一致性中,所有内存操作对所有节点都是按某种顺序出现的。
因此在您的示例中,进程 1、2、和 3 都将以相同的顺序看到内存操作。 (4 个操作有 6 个可能的顺序,但所有进程都会就该顺序达成一致。)
在因果一致性中,进程 1、2 和 3 都可以观察到这些写入以不同的顺序发生。有两条规则:
- 每个人都同意我写的过程与我写它们的过程发生的顺序相同。
- 如果任何进程 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
.
paper that the Wikipedia page points to给出了一些比较有趣的例子(涉及阅读)。
因果内存本身似乎用处不大。在论文的后面,他们展示了如何使用因果内存(和辅助进程)实现类似屏障的东西,但提到似乎没有任何方便的方法来实现关键部分。
所以他们最终做了弱一致或释放一致内存所做的事情,并添加了一个需要顺序一致的同步原语。
关于java - 因果一致性与顺序一致性有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16929389/