C++ 11有一个std :: atomic <T> :: add_and_fetch方法吗?

Tra*_*kel 5 c++ c++11

C++ 11标准包含精彩std::atomic<T>,其中包含以下成员函数:

integral fetch_add(integral, memory_order = memory_order_seq_cst);
Run Code Online (Sandbox Code Playgroud)

然而,似乎缺乏一种add_fetch方法. tbb::atomic<T>重载+=操作符的行为如下add_and_fetch:

 value_type operator+=( D addend ) {
     return fetch_and_add(addend)+addend;
 }
Run Code Online (Sandbox Code Playgroud)

通过经验观察,std::atomic<T>行为方式相同,但我无法在标准中找到它所说的位置,或者只是我的STL实现.标准是否保证了这种行为?

pax*_*blo 5

你是对的,它实际上并没有提供这种功能,但这是因为它不需要.它可以通过已经存在的操作进行模拟.

atomic_fetch_add是一个原子操作,它获取当前值然后添加一些东西.那些"东西"完全在你的控制之下,并没有被改变atomic_fetch_add.

该标准保证:

  1. 返回旧值; 和
  2. 该值已添加.

然后,您可以将值自己添加到返回的内容中,并且在原子操作完成时具有当前值.所以基本上:

def atomic_add_fetch (item, addendum):
    return atomic_fetch_add (item, addendum) + addendum
Run Code Online (Sandbox Code Playgroud)

是操作的伪代码atomic_add_fetch.


Cub*_*bbi 4

std::atomic<T>如果T是整型,则有一个operator+=执行相同操作的成员。它与所有其他原子复合赋值运算符一起在\xc2\xa729.6.5/30-32

\n
\n

CA::operator op=(M 操作数) 易失性 noexcept;

\n

CA::operator op=(M 操作数) noexcept;

\n

作用: fetch_key(操作数)

\n

返回: fetch_key(操作数) op 操作数

\n
\n