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

标签 java c algorithm concurrency memory-model

我了解在顺序一致性中,所有流程都必须按顺序处理。例如:

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 都可以观察到这些写入以不同的顺序发生。有两条规则:

  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.

paper that the Wikipedia page points to给出了一些比较有趣的例子(涉及阅读)。

因果内存本身似乎用处不大。在论文的后面,他们展示了如何使用因果内存(和辅助进程)实现类似屏障的东西,但提到似乎没有任何方便的方法来实现关键部分。

所以他们最终做了弱一致释放一致内存所做的事情,并添加了一个需要顺序一致的同步原语。

关于java - 因果一致性与顺序一致性有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16929389/

相关文章:

c - 用C中的定界符分割字符串

java - 我不能在Java中初始化空字符串数组并随后传入值吗?

java - Spring boot - 无法使用@Value注释

c - Linux 树命令的 C 实现

java - 在 Java 中将带有列表值的映射转换为列表

algorithm - 找到区间最大交点出现2次的点

algorithm - 在不同概率范围内生成随机数

java - 从 IDE 在终端中运行 java 程序时出现 NoClassDefFoundError

java - 使用包的 Eclipse 问题

c++ - 如何从 libcurl 检索目标 IP 地址