std::atomic<double> 变量的赋值保证是原子的吗?

Is assignment to a std::atomic<double> variable guaranteed to be atomic?

我有以下场景

// first assigned a value greater than 0
std::atomic<double> var=1;

//thread 1
while (True) {
    var = 1;
}

//thread 2
if(var >0) {
    //do something
}

我的问题是 thread 1 做作业时,是否有可能 thread 2 看到 var 而不是 1?可能是一些随机数或零?

这似乎发生在我的生产构建中 O2 优化(上面的代码片段不是真正的代码,O2 可能优化得最多)。按照标准,这似乎永远不会发生。

我的描述是否正确,错误在别处?还是我遗漏了什么?

我正在使用 c++17、gcc9.3.1

是的,写入原子类型是原子的。您代码中的错误在别处。

因为它从未被设置为 other 而不是 1,并且 1 的额外写入是原子的,所以不可能有任何一种“拆分读取”,它读取其他一些值(在某些体系结构中可能会发生这种情况,其中值可能跨多条指令写入,并且读取可能会看到高位但看不到低位)。

即使原始数字不是 1,这也是正确的,因为读取线程要么看到整个写入,要么根本看不到写入(原子写入的定义)。