c++ - 如何交换两个 std::atomic 变量?

标签 c++ stdatomic

我有两个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/

相关文章:

c++ - C++ 中带有 "this"的智能指针

c++ - 分离轴定理 : Calculating the MTV for Polygon & Line Segment

c++ - 为什么我的函数返回 long long,返回 705032704?

c++ - 检查数字是否为质数的更好方法是什么?

c++ - 将 QT5 与 glLoadGen 结合使用

c++ - 特殊情况下 `std::map<int, std::atomic<T>>`的线程安全

c++ - 在 C++ 中由 ‘Sequentially Consistent Atomics’ 语义实现时,DCL(双重检查锁定)是否线程安全?

c++ - std::atomic 是否提供原子行为,而不管顺序如何?

C++11 原子。可见性和 thread.join()/停止线程的正确方法

c++ - 在 map 中就地构建不可 move 的对象