我有两个std::atomic
变量,如下所示:
std::atomic<bool> b1;
std::atomic<bool> b2;
在代码中的某个时刻我需要交换它们。它在创建线程之前运行,所以我知道只有主线程,没有其他人试图读/写这些变量。但是:
std::swap(b1, b2);
这会导致:
[...] MSVC\14.24.28314\include\utility(61,1): error C2280: 'std::atomic<bool>::atomic(const std::atomic<bool> &)': attempting to reference a deleted function
[...] MSVC\14.24.28314\include\atomic(1480): message : see declaration of 'std::atomic<bool>::atomic'
[...] MSVC\14.24.28314\include\atomic(1480,5): message : 'std::atomic<bool>::atomic(const std::atomic<bool> &)': function was explicitly deleted
我不确定为什么复制构造函数被删除。所以我使用的解决方案是使用带有第三个变量的旧式交换:
const bool tmp = b1;
b1 = b2.load();
b2 = tmp;
但现在我很好奇:为什么是 std::atomic
的复制构造函数被删除了吗?
(实际代码比两个单独的 std::atomic<bool>
变量更复杂,但我尝试将其简化为这个问题的简单情况。)
最佳答案
你意识到你所做的不是原子的,对吧?从加载 b1
时刻到设置 b2
时刻,它具有各种可能的数据竞争。
大概禁止交换的原因是不可能执行修改两个不相关的内存地址的原子操作(至少,没有足够的可移植性来支持它作为语言标准),所以它拒绝通过默默地使用非原子交换来欺骗您。
方便的话,有other reasons to prohibit copy construction ,因此 std::swap 的默认实现被阻止,作为禁止复制构造的副作用,因此他们所要做的就是拒绝提供撒谎的 swap 实现他们自己。
关于c++ - 如何交换两个 std::atomic 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60556073/