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
,这也是正确的,因为读取线程要么看到整个写入,要么根本看不到写入(原子写入的定义)。
我有以下场景
// 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
,这也是正确的,因为读取线程要么看到整个写入,要么根本看不到写入(原子写入的定义)。