【C++入门到精通】 原子性操作库(atomic) C++11 [ C++入门 ]

在这里插入图片描述

阅读导航

  • 引言
  • 一、原子性操作库简介
  • 二、原子变量
    • 1. 原子类型
    • 2. 原子类型函数
    • 3. 使用示例
  • 三、总结
  • 温馨提示

引言

当谈及并发编程时,确保数据的安全性和一致性是至关重要的。在C++11中引入的原子性操作库(atomic)为我们提供了一种有效且可靠的方式来处理多线程环境下的数据共享与同步问题。原子操作是不可分割的操作,它们可以确保在多线程环境中对共享数据的读写操作是原子的,即不会被其他线程中断或干扰。

本文将继续为大家介绍C++11中的一些重要特性,包括原子性操作库(atomic),这些特性能够帮助我们更好地管理多线程程序,提高程序的性能和稳定性。

一、原子性操作库简介

原子性操作库(atomic)是C++11中新增的标准库,它提供了一种线程安全的方式来访问和修改共享变量,避免了数据竞争的问题。在多线程程序中,如果多个线程同时对同一个变量进行读写操作,就可能会导致数据不一致的问题。原子性操作库通过使用原子操作来保证多个线程同时访问同一个变量时的正确性。

⭕原子性操作库的官方文档

在这里插入图片描述

⭕在原子性操作库中,每个原子变量都有以下几个特点:

  1. 原子变量的读写操作是原子的,即不会被其他线程中断。
  2. 原子变量的值可以被多个线程同时访问和修改。
  3. 原子变量的修改操作是按照一定顺序进行的,保证了多个线程对同一个变量进行操作时的正确性。

原子性操作库中提供了一系列的原子操作函数,包括load、store、exchange、compare_exchange等。load函数用于读取原子变量的值,store函数用于设置原子变量的值,exchange函数用于交换原子变量的值,而compare_exchange函数用于比较并交换原子变量的值。后面我会详细介绍

二、原子变量

原子性操作库(atomic)提供了多种类型的原子变量,包括boolcharshortintlonglong long等基本数据类型,以及intmax_tuintmax_tintptr_t等扩展类型。每个原子变量都有对应的原子类型,比如atomic_boolatomic_charatomic_int等。在使用时,我们需要根据实际的需求选择合适的原子类型和原子变量。

1. 原子类型

下面是原子性操作库中支持的一些原子类型:

原子类型描述
atomic_bool原子布尔型,只能存储true或false。
atomic_char原子字符型,相当于char类型。
atomic_uchar原子无符号字符型,相当于unsigned char类型。
atomic_schar原子有符号字符型,相当于signed char类型。
atomic_short原子短整型,相当于short类型。
atomic_ushort原子无符号短整型,相当于unsigned short类型。
atomic_int原子整型,相当于int类型。
atomic_uint原子无符号整型,相当于unsigned int类型。
atomic_long原子长整型,相当于long类型。
atomic_ulong原子无符号长整型,相当于unsigned long类型。
atomic_llong原子长长整型,相当于long long类型。
atomic_ullong原子无符号长长整型,相当于unsigned long long类型。
atomic_wchar_t原子宽字符型,相当于wchar_t类型。
atomic_char16_t原子16位字符型,相当于char16_t类型。
atomic_char32_t原子32位字符型,相当于char32_t类型。
atomic_intmax_t原子最大宽度整数类型,对应<inttypes.h>中的intmax_t类型。
atomic_uintmax_t原子最大宽度无符号整数类型,对应<inttypes.h>中的uintmax_t类型。
atomic_intptr_t原子指针宽度整数类型,对应<stddef.h>中的intptr_t类型。
atomic_uintptr_t原子指针宽度无符号整数类型,对应<stddef.h>中的uintptr_t类型。
atomic_size_t原子size_t类型,用于表示对象的大小。
atomic_ptrdiff_t原子ptrdiff_t类型,用于表示两个指针之间的距离。

2. 原子类型函数

🚨注意原子类型和原子操作函数需要包含 <atomic> 头文件才能使用

下面是常用的原子类型函数:

函数描述
load()原子读取操作,用于获取原子变量的当前值。
store()原子写入操作,用于设置原子变量的值。
exchange()原子交换操作,用于交换原子变量的值,并返回原始值。
fetch_add()原子加法操作,用于增加原子变量的值,并返回原始值。
fetch_sub()原子减法操作,用于减少原子变量的值,并返回原始值。
fetch_and()原子按位与操作,用于按位与原子变量的值,并返回原始值。
fetch_or()原子按位或操作,用于按位或原子变量的值,并返回原始值。
fetch_xor()原子按位异或操作,用于按位异或原子变量的值,并返回原始值。
fetch_min()原子最小值操作,将原子变量与给定值比较,并将较小的值存储在原子变量中。返回原始值。
fetch_max()原子最大值操作,将原子变量与给定值比较,并将较大的值存储在原子变量中。返回原始值。
fetch_mul()原子乘法操作,将原子变量与给定值相乘,并将结果存储在原子变量中。返回原始值。
fetch_div()原子除法操作,将原子变量与给定值相除,并将结果存储在原子变量中。返回原始值。
fetch_and_not()原子按位与非操作,对原子变量进行按位与非运算,并将结果存储在原子变量中。返回原始值。
fetch_negate()原子取反操作,对原子变量进行取反运算,并将结果存储在原子变量中。返回原始值。
fetch_bitwise_and()原子按位与操作,将原子变量与给定值进行按位与运算,并将结果存储在原子变量中。返回原始值。
fetch_bitwise_or()原子按位或操作,将原子变量与给定值进行按位或运算,并将结果存储在原子变量中。返回原始值。
fetch_bitwise_xor()原子按位异或操作,将原子变量与给定值进行按位异或运算,并将结果存储在原子变量中。返回原始值。

🚨注意以上函数只是原子类型库中的一部分函数,还有其他函数可用于更复杂的操作,具体取决于你的需求。

3. 使用示例

下面是一个使用原子性操作库的样例,展示了如何创建和操作原子变量:

#include <atomic>
#include <iostream>

int main() {
    std::atomic_int counter(0); // 创建一个原子整型变量并初始化为0

    counter++; // 原子操作:递增counter的值

    int value = counter.load(); // 原子操作:读取counter的值
    std::cout << "Counter value: " << value << std::endl;

    counter.store(10); // 原子操作:将counter的值设置为10

    bool exchanged = counter.compare_exchange_weak(value, 5); // 原子操作:比较并交换counter的值
    if (exchanged) {
        std::cout << "Value exchanged successfully!" << std::endl;
    } else {
        std::cout << "Value exchange failed!" << std::endl;
    }

    return 0;
}

在这个样例中,我们首先使用std::atomic_int创建一个原子整型变量counter并将其初始化为0。然后,我们演示了几种原子操作:

  • counter++:原子递增操作,使用++操作符自增counter的值。
  • counter.load():原子读取操作,读取counter的当前值。
  • counter.store(10):原子写入操作,将counter的值设置为10。
  • counter.compare_exchange_weak(value, 5):原子比较并交换操作,比较counter的值与value是否相等,如果相等则将counter的值设为5,并返回交换是否成功的结果。

以上是原子性操作库的简单使用样例,通过使用原子类型和原子操作,我们可以确保多线程环境下对共享变量的安全访问和修改

三、总结

通过学习本文所介绍的内容,我们可以更好地理解并发编程中的原子性操作库的概念和作用。原子操作库提供了一种可靠、高效的方式来处理多线程环境下的数据共享和同步问题。在实际应用中,我们需要根据具体场景选择适当的原子类型和操作函数,并合理设置内存顺序,以平衡性能和正确性需求。

综上所述,原子性操作库是C++11中一个强大而重要的工具,它为我们在多线程编程中处理数据共享与同步提供了有效的解决方案。通过合理运用原子类型和操作函数,我们能够编写出更加健壮和可靠的多线程应用程序。希望本文对读者在学习并发编程中的原子性操作库有所帮助。

温馨提示

感谢您对博主文章的关注与支持!另外,我计划在未来的更新中持续探讨与本文相关的内容,会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/258503.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

我的创作纪念日——成为创作者第1024天

机缘 一、前言 早上收到CSDN的推送信息&#xff0c;今天是我成为创作者的第1024天&#xff0c;回想起自己已经好久没有写博客了&#xff0c;突然间很有感触&#xff0c;想水一篇文章&#xff0c;跟小伙伴们分享一下我的经历。 二、自我介绍 我出生在广东潮汕地区的一个小城…

(1)(1.9) MSP (version 4.2)

文章目录 前言 1 协议概述 2 配置 3 参数说明 前言 ArduPilot 支持 MSP 协议&#xff0c;可通过任何串行端口进行遥测、OSD 和传感器。这样&#xff0c;ArduPilot 就能将遥测数据发送到 MSP 兼容设备&#xff08;如大疆护目镜&#xff09;&#xff0c;用于屏幕显示&#x…

【数据结构】八大排序之简单选择排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.简单选择排序简介及思路 二.简单选择排序的代码实现 三.简单选择排序的优化 四.简单选择排序的时间复杂度分析 结语 一.简单选择排序简介及思路 简单选择排序算法…

11 v-bind指令

概述 v-bind指令可以说是Vue3中最常用的指令之一&#xff0c;使用v-bind&#xff0c;我们几乎能够给任何实现动态的绑定比值。 这里&#xff0c;我们主要演示以下&#xff0c;通过v-bind动态绑定CSS样式。 基本用法 我们创建src/components/Demo11.vue&#xff0c;在这个组…

【Git】Git基本操作

文章目录 Git 是什么Git 的优点Git 安装Linux UbuntuLinux CentOsWindows Git 基本操作1. 创建 Git 本地仓库2. 配置 Git3. Git工作区、暂存区和版本库4. 添加文件5. 查看 .git 文件6. 修改文件7. 版本回退 Git 是什么 Git是一个免费的、开源的分布式版本控制系统&#xff0c;…

Axure RP - 交互设计的强大引擎

目录 前言 1. 交互设计&#xff1a;连接用户与产品的纽带 2. 情景设计&#xff1a;预测用户行为的未来 3. 演示和共享&#xff1a;让设计活起来 我的其他博客 前言 在数字化时代&#xff0c;用户体验的重要性日益突显&#xff0c;而交互设计成为塑造产品与用户互动的关键。…

大创项目推荐 深度学习 机器视觉 人脸识别系统 - opencv python

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 人脸识别系统 该项目…

抢先看!Salesforce Spring ‘24中的10个亮点功能!

Spring 24来临在即&#xff0c;Preview Orgs已上线。在Spring 24中&#xff0c;将会为管理员、开发人员和顾问带来更多新功能。在这片云计算的海洋里&#xff0c;一些亮点功能总能在Salesforce生态系统中引起强烈反响。本篇文章为学习者们盘点了Spring 24中的10个亮点功能&…

什么是年份酒?红酒也有年份酒?

提到年份酒&#xff0c;人们第一时间会想到白酒&#xff0c;市场上有5年&#xff0c;20年&#xff0c;30年不等的各种年份酒。云仓酒庄的品牌雷盛红酒LEESON分享那么&#xff0c;什么是年份酒&#xff0c;红酒有没有年份酒呢&#xff1f; 在红酒酒标上看到一些与年份有关的数字…

海外呼叫中心是什么?海外呼叫中心有哪些功能?海外呼叫中心有哪些应用场景?

海外呼叫中心是什么&#xff1f; 海外呼叫中心通过电话呼出、呼入、智能外呼等渠道&#xff0c;提供客户支持和进行营销、通知等服务。可以为全球范围内的客户提供24小时不间断的电话服务支持&#xff0c;解决客户的疑问和需求。这些呼叫中心通常是有能够覆盖到全球的语音线路…

光条中心线提取-Steger算法 [OpenCV]

在线结构光视觉传感器中&#xff0c;由线激光器发射出的线结构光&#xff0c;在本质上为一个连续且具有一定厚度的空间光平面&#xff0c;而在目标表面上所形成的具有一定宽度的光条特征&#xff0c;即为该光平面与目标表面相交而成的交线。在该空间光平面的厚度方向上&#xf…

MSSql将test数据库还原为另外一个名字test1的数据库

有时候咱们需要将sqlserver数据库还原成另一个数据库中&#xff0c;如下&#xff1a; 1.备份原数据库。右击原数据库选择如下 2.跳到如下页面&#xff0c;如果目标有记录&#xff0c;那么全部进行删除&#xff0c;然后再添加。在“文件名”文本框中输入有效的路径和文件名&…

信号处理基础之噪声与降噪(一) | 噪声分类及python代码实现

后续将给大家分享信号处理基础系列文章&#xff0c;本期是讲噪声相关知识&#xff0c;包括噪声的定义、分类及python代码实现。 1. 噪声的定义 噪声是信息信号在传输过程中所受到的各种各样干扰信号的总成&#xff0c;其直接影响信号的传输质量&#xff0c;甚至破坏正常的信号…

Flask重定向后无效果前端无跳转无反应问题

在网上搜了一下并没有什么好的解决方案&#xff0c;有的话也只是告诉你如何修改代码&#xff0c;并没有讲明白其中的原理以及导致问题的核心&#xff0c;因此特意去了解了一下HTTP的规范找到了答案 问题说明 问题出现的流程大致都是前端发送Ajax请求给后端&#xff0c;进行一些…

泛微e-cology XmlRpcServlet文件读取漏洞复现

漏洞介绍 泛微新一代移动办公平台e-cology不仅组织提供了一体化的协同工作平台,将组织事务逐渐实现全程电子化,改变传统纸质文件、实体签章的方式。泛微OA E-Cology 平台XmRpcServlet接口处存在任意文件读取漏洞&#xff0c;攻击者可通过该漏洞读取系统重要文件 (如数据库配置…

【TI毫米波雷达】上电时序、串口回环BUG及SOP模式不正常工作的解决方案(LP87524电源PMIC芯片的BUCK供电时序配置)

【TI毫米波雷达】雷达上电时序及SOP模式不正常工作的解决方案&#xff08;LP87524电源PMIC芯片的BUCK供电时序配置&#xff09; 文章目录 上电时序上电以后的雷达串口回环问题延迟上电时序LP87524电源PMIC芯片的BUCK供电时序LP87524电源PMIC芯片的BUCK默认供电输出附录&#x…

Java第十九章课堂总结

要开发高级应用程序&#xff0c;就必须掌握一定的图像处理技术。Java绘图是Java程序开发不可缺少的技术&#xff0c;使用这些技术可以为程序提供数据统计、图表分析等功能&#xff0c;还可以为程序搭配音效&#xff0c;提高程序的交互能力。 19.1 Java绘图类 绘图是高级程序设…

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜C

老规矩&#xff0c;先看目录&#xff0c;平均每个3-4C&#xff08;C是月饼&#xff0c;月饼一般分为4块&#xff09; C是什么&#xff0c;是两个都不行了&#xff0c;但联合起来可以&#xff0c;联合的英文是combined&#xff0c;好的&#xff0c;我知道这个英文也记不住&#…

云原生消息流系统 Apache Pulsar 在腾讯云的大规模生产实践

导语 由 InfoQ 主办的 Qcon 全球软件开发者大会北京站上周已精彩落幕&#xff0c;腾讯云中间件团队的冉小龙参与了《云原生机构设计与音视频技术应用》专题&#xff0c;带来了以《云原生消息流系统 Apache Pulsar 在腾讯云的大规模生产实践》为主题的精彩演讲&#xff0c;在本…

原生Android项目中引入Flutter并实现android 与 flutter 之间的通信

前提条件&#xff1a; 完成Flutter安装与环境搭建 一、原生Android项目中引入Flutter 1、在Android项目中&#xff0c;添加Flutter支持的体系结构过滤器 项目 - > app -> build.gradle ...... defaultConfig {......ndk {// Flutter支持的体系结构过滤器abiFilters a…