显式原子加载/存储与通常的 operator= 和 operator T 有啥区别?

Posted

技术标签:

【中文标题】显式原子加载/存储与通常的 operator= 和 operator T 有啥区别?【英文标题】:What is the difference between explicit atomic load/store and usual operator= and operator T?显式原子加载/存储与通常的 operator= 和 operator T 有什么区别? 【发布时间】:2014-11-02 14:59:47 【问题描述】:

考虑这两种变体:

std::atomic<int> a;
a = 1;
int b = a;

std::atomic<int> a;
a.store(1);
int b = a.load();

我从文档中看到第二个是完全原子的,但是我不明白什么时候应该使用哪个以及详细的区别是什么。

【问题讨论】:

【参考方案1】:

这两个例子是等价的; operator=operator T 被定义为分别等效于调用 storeload,使用 memory_order 参数的默认值。

如果您对默认值memory_order_seq_cst 感到满意,以便每次访问都充当内存围栏,那么请使用您认为更好的那个。如果要指定不同的值,则需要使用函数,因为运算符不能接受第二个参数。

【讨论】:

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

以上是关于显式原子加载/存储与通常的 operator= 和 operator T 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

避免在复制构造函数和 operator= 中重复相同的代码

operator== 和 boost::detail::atomic_count 中的显式构造函数?

显式指定通用 lambda 的 operator() 模板参数是不是合法?

我必须明确调用原子加载/存储吗?

显式构造函数和重载

当某些错误可以接受时,顺序加载存储原子的内存顺序应该是啥