// Thread 1:
obj.store(1,Release); // #1
// Thread 2:
obj.store(2, Release); // #2
//Thread 3:
obj.load(Acquire); // #3
obj.load(Relaxed); // #4
假设
#3
读取值1
并且#4
读取值2
,可以很容易推断出:
根据
- ,
之前#1
发生在#3
[比赛简介] p9.1
A 与 B 同步
根据
- ,
之前发生#2
不会在#3
[比赛简介] p18
如果原子对象 M 上的副作用 X 发生在 M 的值计算 B 之前,则评估 B 从 X 或按照 M 的修改顺序从 X 后面的副作用 Y 获取其值。
根据
- ,
之前#3
发生在#4
[比赛简介] p10.1
A 排在 B 之前
连接第三个条件和[intro.races] p16
如果原子对象 M 的值计算 A 发生在 M 的值计算 B 之前,并且 A 从 M 上的副作用 X 获取其值,则 B 计算的值要么是 X 存储的值,要么是存储的值由 M 上的副作用 Y 产生,其中 Y 按照 M 的修改顺序跟随 X。
我们可以推断,
#2
处的副作用在#1
的修改顺序中紧随obj
。
那么,根据[intro.races] p15
,我们是否可以推断
#1
发生在
#2
之前?
如果修改原子对象M的操作A发生在修改M的操作B之前,则A在M的修改顺序上早于B。
在我看来,“M中A早于B”只是“A发生在B之前”的必要条件,换句话说,我们似乎无法推断出
#1
发生在#2
之前,对吧?
我们再看一下这句话:
如果修改原子对象M的操作A发生在修改M的操作B之前,则A在M的修改顺序上早于B。
这句话的形式为“if X, then Y”,其中 X 是“操作 A 和 B 都修改原子对象 M,其中 A 发生在 B 之前”,Y 是“在 M 的修改顺序上,A 早于 B” .
然而,人们无法从逻辑上推断出相反的情况,即“如果 Y,则 X”。如果在 M 的修改顺序中 A 早于 B,则仅从这一规则不能得出 A 发生在 B 之前的结论。