我知道在顺序一致性中,所有流程都必须按顺序处理。例如:
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 中的任何草图或代码都会很棒。谢谢你。
我知道在顺序一致性中,所有流程都必须按顺序处理。例如:
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 都可以观察到这些写入以不同的顺序发生。有两个规则:
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
。
维基百科页面指向的论文给出了一些更有趣的例子(涉及阅读)。
因果记忆本身似乎不是很有用。在论文的后面,他们展示了如何实现类似于带有因果记忆的屏障(和辅助进程),但提到似乎没有任何方便的方法来实现临界区。
所以他们最终会做弱一致或释放一致内存所做的事情,并添加一个同步原语,这需要顺序一致。