根据原子操作的结果可以推断出什么?

问题描述 投票:0回答:1
// 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. #1
    发生在
    #3
  2. 之前

[比赛简介] p9.1

A 与 B 同步

    根据
  1. #2
     不会在 
    #3
  2. 之前发生

[比赛简介] p18

如果原子对象 M 上的副作用 X 发生在 M 的值计算 B 之前,则评估 B 从 X 或按照 M 的修改顺序从 X 后面的副作用 Y 获取其值。

    根据
  1. #3
    发生在
    #4
  2. 之前

[比赛简介] 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
之前,对吧?

c++ language-lawyer atomic
1个回答
0
投票

我们再看一下这句话:

如果修改原子对象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 之前的结论。

© www.soinside.com 2019 - 2024. All rights reserved.