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)

大家都在看

  • EclipseC++学习笔记-4 使用win11 wslg 启动应用

    wslg在win10下无法安装,升级win11后才可以基本按网上方法都能安装成功,但需要注意两点1、wsl –update2、如果启动程序不报错,但是不显示窗口的话 e…

    C++ 2023年5月29日
    049
  • clion运行单个c和c++文件(.c.cpp)

    运行方法 在clion中安装插件:C/C++Single File Execution 在要执行的cpp文件中添加main函数 在cpp文件的编辑器界面中点右键会出现【Add ex…

    C++ 2023年5月29日
    067
  • std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(4)

    1 #ifndef DEADLOCK_QUESTIONDESCRIBLE_AND_SOLUTION_H 2 #define DEADLOCK_QUESTIONDESCRIBLE_A…

    C++ 2023年5月29日
    061
  • C++ 求时差

    C++ 求时差的三种方法 【1】标准C库方式 示例代码 【2】C++库方式 C++11之后才引入 示例代码: 【3】windows API方式 示例代码: 为什么第14行,我们把G…

    C++ 2023年5月29日
    086
  • Google C++ 单元测试 GTest

    from : http://www.cnblogs.com/jycboy/p/6057677.html 一、设置一个新的测试项目 在用google test写测试项目之前,需要先编…

    C++ 2023年5月29日
    042
  • c++ 条件变量

    http://blog.csdn.net/hemmanhui/article/details/4417433 互斥锁:用来上锁。 条件变量:用来等待,当条件变量用来自动阻塞一个线程…

    C++ 2023年5月29日
    048
  • 面向对象C++编程与实践考试题目

    一、选择题(每题2分,共2×20=40分) (1) 以下不能对数组 a 进行正确初始化的语句是( )。A. int a[2][3] = { 0 };B. int a[ ][3] =…

    C++ 2023年5月29日
    047
  • 代朋友发招聘信息,C++程序员

    急招:高级C/C++程序员工作职能:1、开发工具(地图编辑,动作编辑器等)的维护及新版本的开发。2、Symbian、WM新游戏开发要求:1、精通C/C++语言;2、强烈的责任心和认…

    C++ 2023年5月29日
    058
  • C++ #ifndef/#define/#endif解释

    作用:防止头文件的重复包含和编译 ifndef x define x endif 比如说有一个头文件叫head.h,这是一个通用的头文件,然后我又定义了两个自己用的头文件,分别叫l…

    C++ 2023年5月29日
    046
  • C+++string类如何判断字符串为空

    string类是C++STL类之一,有很丰富的接口。 string类为空,实际也就是元素为0个。 可以按照如下方式判断: 1、string类有自己的成员函数empty, 可以用来判…

    C++ 2023年5月29日
    069
  • 如何分析和提高(C/C++)程序的编译速度?

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。 本文链接:https://www.cnblogs.com/lihuidashe…

    C++ 2023年5月29日
    0100
  • c++如何遍历删除map/vector里面的元素

    新技能Get! 对于c++里面的容器, 我们可以使用iterator进行方便的遍历. 但是当我们通过iterator对vector/map等进行修改时, 我们就要小心了, 因为操作…

    C++ 2023年5月29日
    095
  • c++ 读写文本文件

    1 #include 2 #include // 读写文件的头文件 …

    C++ 2023年5月29日
    051
  • c++11并行、并发与多线程编程

    首先,我们先理解并发和并行的区别。 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃…

    C++ 2023年5月29日
    061
  • C++C#联合调试

    https://blog.csdn.net/BYH371256/article/details/79815097 Original: https://www.cnblogs.com…

    C++ 2023年5月29日
    066
  • Android JNI之C/C++层调用JAVA

    从C/C++层调用JAVA层代码步骤: 1. 在JAVA类中创建java方法和本地方法 public class TestNdk{ int a;//本示例中将被修改的JAVA变量 …

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