原子对象的值计算结果是否未指定?[复制]

Is the result of the value computation of an atomic object unspecified? [duplicate]

提问人:xmh0511 提问时间:11/13/2023 最后编辑:xmh0511 更新时间:11/14/2023 访问量:115

问:

[intro.races] p14说:

由评估 B 确定的原子对象 M 的值应为修改 M 的某个副作用 A 存储的值,其中 B 不会在 A 之前发生。

“一些副作用 A”可能是指修改顺序中的随机值,本 https://github.com/cplusplus/draft/pull/6501 证实了这一点。因此,请考虑以下示例:

std::atomic<int> v{0};
auto c = [](){v.store(1,std::memory_order::release); return 1;}();
auto c2 = [](){v.store(2,std::memory_order::release); return 2;}();

int main(){
   auto r = v.load(std::memory_order::acquire); // #1
}

首先,我们可以确定在这些修改之前不会发生这种情况。那么,在 的值计算结果是什么?是修改顺序中的最新值,还是可以是 、 或 ,其中任何一个是可能的,这是未指定的?在这个例子中,实现总是说结果是,即使结果也遵守规则,但是,我想知道这个结果是否是确定的?或者,它只是一种未指定的行为。#1#10122

C++ 语言-律师 原子

评论

1赞 T.C. 11/13/2023
eel.is/c++draft/intro.races#18
0赞 xmh0511 11/13/2023
@T.C.这条规则没有解释我在问题中问的问题。如果读取,则不违反 [intro.races] p18#10
1赞 273K 11/13/2023
这与原子无关,原子在那里很奇怪
0赞 Peter Cordes 11/13/2023
全局范围的初始值设定项不是在 的主体之前排序的吗?它们发生在主线程中,因此两个存储都发生在加载之前。(正如 273K 所指出的,main 使用非常量初始值设定项读取非全局变量是安全的。它可以加载其中之一,也可以根据执行顺序的实现细节进行加载,但由于写入-读取一致性规则,它无法加载。mainatomic120
1赞 Peter 11/13/2023
@PeterCordes我正要开始写一些东西来表达这一点。我建议你把你的观察变成答案。从本质上讲 - 保证 、 和 的初始化(都在一个翻译单元中)按顺序初始化,并在调用之前完成它们的副作用(调用 lambda 函数)。[原子的使用实际上也没有改变任何事情]。vcc2main()

答: 暂无答案