C++11 并发指南六(atomic 类型详解三 std::atomic (续))

总地来说,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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2.设计模式-七大原则(C++)

    任何一个设计模式都离不开七大原则中的任一原则.所以七大原则非常重要,只要我们明白了七大原则,就可以知道如何在项目中使用什么设计原则了. 设计模式的七大原则如下所示: 1.单一职责原…

    C++ 2023年5月29日
    046
  • C++中的friend函数详细解析(二)

    一.设计模式 单例模式(类只能生成一个对象) 屏蔽构造函数,拷贝构造函数(放在private中 类外无法访问),此时类外就无法看到这两个函数了 也就无法生成对象了 类就没有意义了 …

    C++ 2023年5月29日
    052
  • Silverlight5通过P/Invoke调用自定义C/C++ DLL(Lua)

    注1:为了确保silverilght5在浏览器或桌面上成功调用win32 DLL,必须在项目属性中勾选相应的权限: 勾选Enable running application out…

    C++ 2023年5月29日
    074
  • 【C++自绘控件】如何用GDI+来显示图片

    在我们制作一个应用软件的时候往往需要在窗口或控件中添加背景图。而图片不仅有BMP格式的,还有JPEG、PNG、TIFF、GIF等其它的格式。那么如何用jpg格式的图片来当背景呢? …

    C++ 2023年5月29日
    060
  • C++ 资源大全

    http://www.uml.org.cn/c++/201411145.asp http://ezlippi.com/blog/2014/12/c-open-project.htm…

    C++ 2023年5月29日
    049
  • const 在 C 和 C++ 中的区别

    1 C 中的 const 内存分配 1.1 修饰全局变量 cpp;gutter:true;</p> <h1>include</h1> <p…

    C++ 2023年5月29日
    046
  • C/C++中 sizeof 详解

    Sizeof的作用非常简单:求对象或者类型的大小。然而sizeof又非常复杂,它涉及到很多特殊情况,本篇把这些情况分门别类,总结出了sizeof的10个特性: (0)sizeof是…

    C++ 2023年5月29日
    056
  • C++中的静态绑定和动态绑定(转)

    C++在面向对象编程中,存在着静态绑定和动态绑定的定义,本节即是主要讲述这两点区分。我是在一个类的继承体系中分析的,因此下面所说的对象一般就是指一个类的实例。首先我们需要明确几个名…

    C++ 2023年5月29日
    043
  • 《Accelerated C++》学习笔记(1)——学习资料

    最近找到一本C++的书籍,英文名字《 Accelerated C++: Practical Programming by Example》,作者 Andrew Koenig, Ba…

    C++ 2023年5月29日
    063
  • EclipseC++学习笔记-10 warnings being treated as errors,,error: format ‘%u’ expects argument of type

    增加选项All Options增加-Wformat=0 本博客是个人工作中记录,遇到问题可以互相探讨,没有遇到的问题可能没有时间去特意研究,勿扰。另外建了几个QQ技术群:2、全栈技…

    C++ 2023年5月29日
    043
  • 右值引用与转移语义(C++11)

    参考资料: 左值和右值定义: C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的 左值的定义就是非临时对象(可以取地址,有名字),那些可以在多条语句中使用的对…

    C++ 2023年5月29日
    069
  • JNI支持C++与C的区别

    C++的代码后缀是”.cpp” 在JNI.h 文件中有两套代码。一套是支持c的, 一套是支持JNI的。 JNI中针对C的代码是: C中调用方式: JNI中针…

    C++ 2023年5月29日
    060
  • 从C++到GO

    刚开始接触Go语言,看了两本Go语言的书,从c++开发者的角度来看看go语言的新特性,说下自己感触较深的几点: 并发编程 Go语言层面支持协程,将并发业务逻辑从异步转为同步,大幅提…

    C++ 2023年5月29日
    051
  • C++11 并发指南五(std::condition_variable 详解)

    std::condition_variable 是条件变量,更多有关条件变量的定义参考维基百科。Linux 下使用 Pthread 库中的 pthread_cond_*() 函数提…

    C++ 2023年5月29日
    060
  • 生成1~n之间随机整数_c++

    rand() % (high – low + 1) + low; Original: https://www.cnblogs.com/douzujun/p/16457919.htm…

    C++ 2023年5月29日
    036
  • 【C++服务端技术】对象池

    代码没贴全,就少一个锁头文件,可以做设计参考 设计思想就是维护一个空闲链表,没有用的就重新申请,有的话就拿链表的头,使用完又还给空闲链表。 /* 一个分配固定大小内存的内存池,使用…

    C++ 2023年5月29日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球