分配是不是等同于 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】:是的,它们是一样的。我认为提供重载运算符的原因是为了方便。更不用说更容易将现有代码转换为使用原子。
就个人而言,我更喜欢始终明确地使用load
和store
。我认为这是更好的做法,它会迫使你记住你正在处理一个原子。
此外,这些函数允许您指定其他内存顺序,这在重载运算符版本中是不可能的。
【讨论】:
啊哈!那么当我们使用 = 时,是 std::default memory_order_seq_cst 吗? 是的。根据cppreference,operator =
“以原子方式将值 t 赋给原子变量。等价于store(desired)
。”,operator T
类似。
另外,使用 load() 会强制复制到另一个变量。使用赋值使代码经常在不需要时一遍又一遍地从原子重新加载。
Zan Lynx 一遍又一遍地从原子重新加载是什么意思?我不明白
另外一个问题:为什么std::acomic<bool> a = true; std::atomic<bool> b = a;
是不允许的,而std::acomic<bool> a = true; std::atomic<bool> b = a.load();
是?以上是关于分配是不是等同于 std::atomic<bool> 的加载/存储的主要内容,如果未能解决你的问题,请参考以下文章
C++ error: use of deleted function ‘std::atomic<short unsigned int>::atomic(const std::atomic<short