赋值等效于std :: atomic <bool>的加载/存储

时间:2016-01-21 05:19:39

标签: c++ c++11 concurrency stdatomic

我发现这可能会在问题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);

如果情况确实如此:

  1. 为什么有2种选择?什么是明显的好处?
  2. 在处理原子时更喜欢更冗长的load()/ store()而不是潜在的混淆赋值(=),这可能意味着要么取决于LHS还是RHS是原子的,这是一种好的做法。
  3. 注意我已经意识到这两个变量都不能是std :: atomic,即LHS和RHS,因为在一条指令中不可能原子地读写。

1 个答案:

答案 0 :(得分:5)

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

就个人而言,我希望始终明确loadstore。我认为这是更好的练习并迫使你记住你正在处理一个原子。

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