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实现.标准是否保证了这种行为?
你是对的,它实际上并没有提供这种功能,但这是因为它不需要.它可以通过已经存在的操作进行模拟.
atomic_fetch_add是一个原子操作,它获取当前值然后添加一些东西.那些"东西"完全在你的控制之下,并没有被改变atomic_fetch_add.
该标准保证:
然后,您可以将值自己添加到返回的内容中,并且在原子操作完成时具有当前值.所以基本上:
def atomic_add_fetch (item, addendum):
return atomic_fetch_add (item, addendum) + addendum
Run Code Online (Sandbox Code Playgroud)
是操作的伪代码atomic_add_fetch.
std::atomic<T>如果T是整型,则有一个operator+=执行相同操作的成员。它与所有其他原子复合赋值运算符一起在\xc2\xa729.6.5/30-32
\n\nCA::operator op=(M 操作数) 易失性 noexcept;
\nCA::operator op=(M 操作数) noexcept;
\n作用: fetch_key(操作数)
\n返回: fetch_key(操作数) op 操作数
\n
| 归档时间: |
|
| 查看次数: |
2789 次 |
| 最近记录: |