顺序一致的系统可以保证它的行为总是看起来与所涉及的某些顺序执行的读取和写入相同,与每个处理器正在执行的程序中读取和写入的相对顺序一致。它不保证不同处理器执行的两个操作会出现什么顺序。
你肯定有可能最终得到:
P1: store(x, 1)
P2: store(y, 1)
P1: load(y) // 1
P2: load(x) // 1
并且两个处理器都不会增加 z。但是,系统选择它也是完全合理的:
P1: store(x, 1)
P1: load(y) // 0
P1: store(z, z+1)
P2: store(y, 1)
P2: load(x) // 1
'z' 最终设置为 1。如果需要确定性结果,则需要添加锁定。顺序一致的系统确实可以保证 z 永远不会为 2:没有办法重新排序写入,以便两个进程都加载 0 值并增加 z 而不会违反顺序一致性。
相比之下,通常一致的系统并不能保证其行为总是与所涉及的单个顺序执行读取和写入相同。不同的处理器以不同的顺序查看其他人的写入是完全可以的,除非这些写入通常相关。你很可能最终得到:
// P1's local history
P1: store(x, 1)
P1: load(y) // 0
P1: store(z, z+1)
P2: store(y, 1)
// P2's local history
P2: store(y, 1)
P2: load(x) // 0
P2: store(z, z+1)
P1: store(x, 1)
z 的最终值为 2。什么因果一致性可以保证您执行的是第三个进程:
if (z == 2)
print(x, y)
永远不会打印 0:
- 如果 P3 加载/打印 x 和 y,则加载必须在其加载 z 之后发生
- 如果 z 的负载值为 2,则它必须发生在 P1 和 P2 在 P3 的本地历史中的相同增量之后
- P1 的 store(x, 1) 必须出现在它的 z 增量之前;P2/y 类似
通过传递性,包含打印语句的 P3 的任何本地历史都必须看到 x 和 y 的历史。