分配是不是等同于 std::atomic<bool> 的加载/存储

Posted

技术标签:

【中文标题】分配是不是等同于 std::atomic<bool> 的加载/存储【英文标题】:Is assignment equivalent to load/store for std::atomic<bool>分配是否等同于 std::atomic<bool> 的加载/存储 【发布时间】:2016-04-27 05:40:30 【问题描述】:

我看到这个问题可能在Must I call atomic load/store explicitly? 中得到回答。

因此,为了清楚起见,我将简洁地重申我的问题,希望未来的读者能明白这一点。

std::atomic<bool> b(false);
bool x = b;

std::atomic<bool> b(false);
bool x = b.load();

还有

std::atomic<bool> b(false);
b = true;

std::atomic<bool> b(false);
b.store(true);

如果确实如此,那么:

    为什么有 2 个选项?有什么明显的好处? 在处理原子时,最好使用更冗长的 load()/store() 而不是可能令人困惑的 assignment(=),这可能意味着取决于 LHS 还是 RHS 是原子的。

注意我已经知道这两个变量不能是 std::atomic 即 LHS 和 RHS,因为不可能在一条指令中原子地读写。

【问题讨论】:

【参考方案1】:

是的,它们是一样的。我认为提供重载运算符的原因是为了方便。更不用说更容易将现有代码转换为使用原子。

就个人而言,我更喜欢始终明确地使用loadstore。我认为这是更好的做法,它会迫使你记住你正在处理一个原子。

此外,这些函数允许您指定其他内存顺序,这在重载运算符版本中是不可能的。

【讨论】:

啊哈!那么当我们使用 = 时,是 std::default memory_order_seq_cst 吗? 是的。根据cppreference,operator =“以原子方式将值 t 赋给原子变量。等价于store(desired)。”operator T 类似。 另外,使用 load() 会强制复制到另一个变量。使用赋值使代码经常在不需要时一遍又一遍地从原子重新加载。 Zan Lynx 一遍又一遍地从原子重新加载是什么意思?我不明白 另外一个问题:为什么std::acomic&lt;bool&gt; a = true; std::atomic&lt;bool&gt; b = a;是不允许的,而std::acomic&lt;bool&gt; a = true; std::atomic&lt;bool&gt; b = a.load();是?

以上是关于分配是不是等同于 std::atomic<bool> 的加载/存储的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能交换 std::atomic<T> ?

原子读取然后用 std::atomic 写入

std::atomic_flag 停止多个线程

C++ error: use of deleted function ‘std::atomic<short unsigned int>::atomic(const std::atomic<short

在 Windows 中等待 std::atomic<int> 的正确方法?

未解析的外部符号“std::atomic_fetch_add”