总地来说,C++11 标准库中的 std::atomic 针对整形(integral)和指针类型的特化版本新增了一些算术运算和逻辑运算操作。具体如下:
下面我们来简单介绍以上的 std::atomic 特化版本的成员函数。
if T is integral (1)
T fetch_add (T val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_add (T val, memory_order sync = memory_order_seq_cst) noexcept;
if T is pointer (2)
T fetch_add (ptrdiff_t val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_add (ptrdiff_t val, memory_order sync = memory_order_seq_cst) noexcept;
将原子对象的封装值加 val,并返回原子对象的旧值(适用于整形和指针类型的 std::atomic 特化版本),整个过程是原子的。sync 参数指定内存序: Memory Order 值Memory Order 类型 memory_order_relaxed Relaxed memory_order_consume Consume memory_order_acquire Acquire memory_order_release Release memory_order_acq_rel Acquire/Release memory_order_seq_cst Sequentially consistent 另外,如果第二个参数不指定(取默认参数 memory_order_seq_cst),则 fetch_add 相当与 std::atomic::operator+=。
if T is integral (1)
T fetch_sub (T val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_sub (T val, memory_order sync = memory_order_seq_cst) noexcept;
if T is pointer (2)
T fetch_sub (ptrdiff_t val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_sub (ptrdiff_t val, memory_order sync = memory_order_seq_cst) noexcept;
将原子对象的封装值减 val,并返回原子对象的旧值(适用于整形和指针类型的 std::atomic 特化版本),整个过程是原子的。sync 参数指定内存序: Memory Order 值Memory Order 类型 memory_order_relaxed Relaxed memory_order_consume Consume memory_order_acquire Acquire memory_order_release Release memory_order_acq_rel Acquire/Release memory_order_seq_cst Sequentially consistent 另外,如果第二个参数不指定(取默认参数 memory_order_seq_cst),则 fetch_sub 相当与 std::atomic::operator-=。
将原子对象的封装值按位与 val,并返回原子对象的旧值(只适用于整型的 std::atomic 特化版本),整个过程是原子的。sync 参数指定内存序: Memory Order 值Memory Order 类型 memory_order_relaxed Relaxed memory_order_consume Consume memory_order_acquire Acquire memory_order_release Release memory_order_acq_rel Acquire/Release memory_order_seq_cst Sequentially consistent 另外,如果第二个参数不指定(取默认参数 memory_order_seq_cst),则 fetch_add 相当与 std::atomic::operator&=。
将原子对象的封装值按位或 val,并返回原子对象的旧值(只适用于整型的 std::atomic 特化版本),整个过程是原子的。sync 参数指定内存序: Memory Order 值Memory Order 类型 memory_order_relaxed Relaxed memory_order_consume Consume memory_order_acquire Acquire memory_order_release Release memory_order_acq_rel Acquire/Release memory_order_seq_cst Sequentially consistent 另外,如果第二个参数不指定(取默认参数 memory_order_seq_cst),则 fetch_or 相当与 std::atomic::operator|=。
将原子对象的封装值按位异或 val,并返回原子对象的旧值(只适用于整型的 std::atomic 特化版本),整个过程是原子的。sync 参数指定内存序: Memory Order 值Memory Order 类型 memory_order_relaxed Relaxed memory_order_consume Consume memory_order_acquire Acquire memory_order_release Release memory_order_acq_rel Acquire/Release memory_order_seq_cst Sequentially consistent 另外,如果第二个参数不指定(取默认参数 memory_order_seq_cst),则 fetch_xor 相当与 std::atomic::operator^=。
pre-increment (1)
T operator++() volatile noexcept;
T operator++() noexcept;
post-increment (2)
T operator++ (int) volatile noexcept;
T operator++ (int) noexcept;
复合赋值运算符重载,主要包含以下形式:
if T is integral (1)
T operator+= (T val) volatile noexcept;
T operator+= (T val) noexcept;
T operator-= (T val) volatile noexcept;
T operator-= (T val) noexcept;
T operator&= (T val) volatile noexcept;
T operator&= (T val) noexcept;
T operator|= (T val) volatile noexcept;
T operator|= (T val) noexcept;
T operator^= (T val) volatile noexcept;
T operator^= (T val) noexcept;
if T is pointer (2)
T operator+= (ptrdiff_t val) volatile noexcept;
T operator+= (ptrdiff_t val) noexcept;
T operator-= (ptrdiff_t val) volatile noexcept;
T operator-= (ptrdiff_t val) noexcept;
以上各个 operator 都会有对应的 fetch_* 操作,详细见下表:
操作符成员函数支持类型 复合赋值等价于整型指针类型其他类型
atomic::operator+= atomic::fetch_add 是 是 否
atomic::operator-= atomic::fetch_sub 是 是 否
atomic::operator&= atomic::fetch_and 是 否 否
atomic::operator|= atomic::fetch_or 是 否 否
atomic::operator^= atomic::fetch_xor 是 否 否
好了,本节先介绍这里,下一节我会介绍 C++11 中 C 风格的原子操作 API。
Original: https://www.cnblogs.com/haippy/p/3304556.html
Author: Haippy
Title: C++11 并发指南六(atomic 类型详解三 std::atomic (续))
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535384/
转载文章受原作者版权保护。转载请注明原作者出处!