对 C++ 11 原子变量的哪些操作实际上是原子的?
What operations on a c++ 11 atomic variable are actually atomic?
我正在阅读有关 std::atomic (https://en.cppreference.com/w/cpp/atomic/atomic) 的 cpp 参考手册,我对实际以原子方式执行的确切操作感到困惑。
我遇到问题的主要操作:
运算符=、运算符+ 和运算符+=
我知道这些操作是为模板定义的,我只是不确定它们是否以及何时实际上是原子的。如果对此类变量的操作是原子操作而不是原子操作,我将不胜感激。
编辑:
我已阅读此处引用的问题:
我仍然很困惑。例如,假设 a 是一个原子整数。 a+=100 等于 a.fetch_add(100) 吗?
同一行提问,a.load(100)是否等同于a=100?
如果标准指定一个操作是原子的(它对 std::atomic<T>
上的所有内容都这样做,除了构造函数),那么它 是 。确保标准的承诺得到遵守取决于实施。如果实施 不 兑现承诺,那么您手上就有一个 non-conforming 实施。
原子变量上的每个 operation 都是独立的原子变量,即通过重载或显式调用 std::atomic
(成员)函数。多次调用不会构成一个原子事务,即使您在单个语句或表达式中执行多个调用也是如此。
看完@Treebeard 的 link https://www.youtube.com/watch?v=ZQFzMfHIxng(相关信息请观看第 13-15 分钟)
对原子变量执行的任何操作都是原子的。但是,同一行可以包含多个操作。
因此,例如给出以下代码:
std::atomic<int> a = 1;
std::atomic<int> b = 1;
auto c = std::atomic<int>(0);
c = a + b;
最后一行不是原子操作,因为 a+b 本身就是原子操作,operator= 本身就是原子操作。然而,它们一起构成了 2 个操作,它们一起不是原子的。总而言之,我建议使用模板的显式函数,例如 load()、fetch_add() 和 store(),而不是使用标准的重载运算符,因为这些可以保证以原子方式执行。
我正在阅读有关 std::atomic (https://en.cppreference.com/w/cpp/atomic/atomic) 的 cpp 参考手册,我对实际以原子方式执行的确切操作感到困惑。
我遇到问题的主要操作:
运算符=、运算符+ 和运算符+=
我知道这些操作是为模板定义的,我只是不确定它们是否以及何时实际上是原子的。如果对此类变量的操作是原子操作而不是原子操作,我将不胜感激。
编辑:
我已阅读此处引用的问题:
同一行提问,a.load(100)是否等同于a=100?
如果标准指定一个操作是原子的(它对 std::atomic<T>
上的所有内容都这样做,除了构造函数),那么它 是 。确保标准的承诺得到遵守取决于实施。如果实施 不 兑现承诺,那么您手上就有一个 non-conforming 实施。
原子变量上的每个 operation 都是独立的原子变量,即通过重载或显式调用 std::atomic
(成员)函数。多次调用不会构成一个原子事务,即使您在单个语句或表达式中执行多个调用也是如此。
看完@Treebeard 的 link https://www.youtube.com/watch?v=ZQFzMfHIxng(相关信息请观看第 13-15 分钟)
对原子变量执行的任何操作都是原子的。但是,同一行可以包含多个操作。
因此,例如给出以下代码:
std::atomic<int> a = 1;
std::atomic<int> b = 1;
auto c = std::atomic<int>(0);
c = a + b;
最后一行不是原子操作,因为 a+b 本身就是原子操作,operator= 本身就是原子操作。然而,它们一起构成了 2 个操作,它们一起不是原子的。总而言之,我建议使用模板的显式函数,例如 load()、fetch_add() 和 store(),而不是使用标准的重载运算符,因为这些可以保证以原子方式执行。