【发布时间】:2019-10-18 02:38:16
【问题描述】:
我的问题很简单:是否有任何并行算法,其中使用 T 的普通类型的对象是合法且安全的(定义明确,保证工作),而使用 std::atomic<T> 对象会导致未指定或未定义的行为? 换句话说,非原子类型有可能提供比原子类型更强的保证吗?
当原子对象对常规对象有效时,内存可见性的所有保证是否都有效?
[这意味着编译器可以同等对待(宽松的)原子和非原子操作,从而简化中间表示。]
如果是,这是否可以正式证明?
当然类型T 使得std::atomic<T> 不是std::atomic 的有效特化不计算在内。
【问题讨论】:
-
不,没有这样的上下文。
-
vector<bool>是特殊的(压缩位数组),vector<atomic<bool>>不是。但是vector<atomic<T>>几乎无法使用(不可复制,因此只有固定大小的构造和[]访问工作,而不是push_back),我不认为这是你的想法。 (你可以想象通过硬编码一些关于对象表示或大小的假设来打破它,也许,如果.data()甚至可以被vector<bool>访问)。 -
@PeterCordes 完全不是我想知道的,但仍然值得一提。
标签: c++ language-lawyer race-condition memory-model stdatomic