显式原子加载/存储和通常的运算符=和运​​算符T之间有什么区别?

Jus*_*ter 16 c++ c++11 stdatomic

考虑以下两种变体:

std::atomic<int> a;
a = 1;
int b = a;
Run Code Online (Sandbox Code Playgroud)

std::atomic<int> a;
a.store(1);
int b = a.load();
Run Code Online (Sandbox Code Playgroud)

我从文档中看到第二个是完全原子的,但我不明白何时应该使用哪个以及什么是细节上的差异.

Mik*_*our 20

这两个例子是等价的; operator=并且operator T被定义为等效于使用参数的默认值调用store和.loadmemory_order

如果您对该默认值感到满意memory_order_seq_cst,那么每次访问都充当内存栅栏,那么请使用看起来更漂亮的内容.如果要指定其他值,则需要使用这些函数,因为运算符不能接受第二个参数.

  • 值得注意的是`memory_order_seq_cst`是最强的内存排序.除了在不需要完全顺序一致性的情况下提高性能之外,没有理由指定另一个. (10认同)
  • 我更喜欢 `load` / `store` 因为它表明变量是一个原子变量,它增强了代码的可读性! (3认同)