C++11中atomic

C++11中atomic

在C++中,std::atomic 是一个非常重要的工具,主要用于实现线程安全的操作。它属于C++11标准引入的 <atomic> 头文件的一部分,用于处理多线程环境下的原子操作。以下是 std::atomic 的主要作用和特点:

1. 保证操作的原子性

原子操作是指一个不可分割的操作,它在执行过程中不会被其他线程中断。std::atomic 可以确保对变量的读取、修改和写入操作是原子性的,即使在多线程环境下也不会出现竞态条件(Race Condition)。

例如,普通的整数变量操作可能被编译器或硬件拆分成多个步骤,但在多线程环境下,这些步骤可能会被其他线程打断,从而导致数据不一致。而 std::atomic 可以保证这些操作是完整的、不可分割的。

std::atomic<int> counter(0);
counter++;  // 原子操作,不会被打断

2. 线程安全

std::atomic 提供了一种轻量级的线程安全机制。它可以用于保护共享变量,避免多线程访问时的冲突。与互斥锁(std::mutex)相比,std::atomic 更高效,因为它不需要操作系统级别的锁机制,而是通过硬件支持的原子指令来实现。

#include <iostream>
#include<atomic>
#include<thread>
#include<vector>
using namespace std;std::atomic<int> g_Count = 0;void IncrementCounter()
{for (int i = 0; i < 10000; i++){// 线程安全的原子操作g_Count++;}
}int main()
{std::vector<thread> vtThreads;for(int i=0;i<10;i++){vtThreads.emplace_back(IncrementCounter);}for(auto& t: vtThreads){t.join();}std::cout << "Final value:"<< g_Count << endl;std::cout << "Hello World!\n";
}

代码运行结果:

微信截图_20250305233946

3. 内存序(Memory Ordering)

std::atomic 还提供了对内存序的控制,用于解决多线程环境下的内存可见性和指令重排序问题。C++ 提供了多种内存序选项,例如 std::memory_order_seq_cst(顺序一致性)、std::memory_order_acquire(获取)、std::memory_order_release(释放)等。

这些内存序选项允许程序员更精细地控制线程之间的同步和可见性,从而优化多线程程序的性能。

4. 支持多种数据类型

std::atomic 不仅可以用于基本数据类型(如 intfloatbool 等),还可以用于指针类型和用户自定义类型(通过特化模板)。这使得它在多线程编程中非常灵活。

std::atomic<int*> atomic_ptr(nullptr);void set_pointer(int* ptr) {atomic_ptr.store(ptr, std::memory_order_release);
}void get_pointer() {int* ptr = atomic_ptr.load(std::memory_order_acquire);// 使用 ptr
}

5. 性能优势

与传统的互斥锁相比,std::atomic 通常具有更好的性能,因为它依赖于硬件的原子指令,而不是操作系统级别的锁。在某些场景下,使用 std::atomic 可以显著减少线程同步的开销。

总结

std::atomic 是C++中实现线程安全和原子操作的重要工具。它不仅能够保证操作的原子性,还可以通过内存序控制解决复杂的多线程同步问题。在设计多线程程序时,合理使用 std::atomic 可以提高代码的效率和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尚庭公寓项目记录

数据库准备 保留图像时&#xff0c;保存图像地址就可以数据表不是越多越好&#xff0c;可以用中间表来实现俩个表之间的联立这样方便查数据但是却带来性能问题而减少表的jion但是提高性能&#xff0c;以冗余来换去性能采用MySQL&#xff0c;InnoDB存储引擎物理删除和逻辑删除逻…

unity6 打包webgl注意事项

webgl使用资源需要异步加载 使用localization插件时要注意&#xff0c;webgl不支持WaitForCompletion&#xff0c;LocalizationSettings.InitializationOperation和LocalizationSettings.StringDatabase.GetTable都不能用 web里想要看到具体的报错信息调试开启这两个&#xf…

wxWidgets GUI 跨平台 入门学习笔记

准备 参考 https://wiki.wxwidgets.org/Microsoft_Visual_C_NuGethttps://wiki.wxwidgets.org/Tools#Rapid_Application_Development_.2F_GUI_Buildershttps://docs.wxwidgets.org/3.2/https://docs.wxwidgets.org/latest/overview_helloworld.htmlhttps://wizardforcel.gitb…

C++20 中使用括号进行聚合初始化:新特性与实践指南

文章目录 1. 聚合初始化简介2. C20 中的括号聚合初始化2.1 指定初始化器&#xff08;Designated Initializers&#xff09;2.2 嵌套聚合初始化 3. 使用括号初始化数组4. 注意事项5. 实际应用场景6. 总结 在 C20 中&#xff0c;聚合初始化&#xff08;Aggregate Initialization&…

TomcatServlet

https://www.bilibili.com/video/BV1UN411x7xe tomcat tomcat 架构图&#xff0c;与 jre&#xff0c;应用程序之前的关系 安装使用 tomcat 10 开始&#xff0c;api 从 javax.* 转为使用 jakarta.*&#xff0c;需要至少使用 jdk 11 cmd 中默认 gbk 编码&#xff0c;解决控制…

android接入rocketmq

一 前言 RocketMQ 作为一个功能强大的消息队列系统&#xff0c;不仅支持基本的消息发布与订阅&#xff0c;还提供了顺序消息、延时消息、事务消息等高级功能&#xff0c;适应了复杂的分布式系统需求。其高可用性架构、多副本机制、完善的运维管理工具&#xff0c;以及安全控制…

有关Java中的集合(1):List<T>和Set<T>

学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点&#xff1a;有序表示存取有序&#xff08;因为有索引&#xff09;而且可以重复 ● List常用实现类&#xff1a; ArrayList、LinkedList、Vector等 1.1 常用方法…

DeepSeek+Graphrag检索增强

用于增强的文章为一篇机器学习的文章&#xff0c;以及本人自己的论文 对于此感兴趣的可私聊我&#xff0c;过多细节不便展示 实现方法 图构建 数据收集&#xff1a;收集与检索相关的各种数据&#xff0c;如文本、图像、元数据等。实体识别和关系抽取&#xff1a;从收集的数据…

利用opencv_python(pdf2image、poppler)将pdf每页转为图片

1、安装依赖pdf2image pip install pdf2image 运行.py报错&#xff0c;因为缺少了poppler支持。 2、安装pdf2image的依赖poppler 以上命令直接报错。 改为手工下载&#xff1a; github: Releases oschwartz10612/poppler-windows GitHub 百度网盘&#xff1a; 百度网盘…

C# Unity 面向对象补全计划 之 [反射]自动处理带有自定义[特性]的类

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 有一些插件就是利用本篇的方法做"自动"处理的 目录 1.情景: 2.介绍与举例: 自定义特性API与使用 反射搜索自定义API 3.优化 4.处理带有自定义特性的类…

AI-Deepseek + PPT

01--Deepseek提问 首先去Deepseek问一个问题&#xff1a; Deepseek的回答&#xff1a; 在汽车CAN总线通信中&#xff0c;DBC文件里的信号处理&#xff08;如初始值、系数、偏移&#xff09;主要是为了 将原始二进制数据转换为实际物理值&#xff0c;确保不同电子控制单元&…

SpringMVC控制器定义:@Controller注解详解

文章目录 引言一、Controller注解基础二、RequestMapping与请求映射三、参数绑定与数据校验四、RestController与RESTful API五、控制器建议与全局处理六、控制器测试策略总结 引言 在SpringMVC框架中&#xff0c;控制器(Controller)是整个Web应用的核心组件&#xff0c;负责处…

自然语言处理:文本分类

介绍 大家好&#xff0c;我这个热衷于分享知识的博主又来啦&#xff01;之前我们一起深入探讨了自然语言处理领域中非常重要的两个方法&#xff1a;朴素贝叶斯和逻辑斯谛回归。在探索的过程中&#xff0c;我们剖析了朴素贝叶斯如何基于概率原理和特征条件独立假设&#xff0c;…

鸿蒙通过用户首选项实现数据持久化

鸿蒙通过用户首选项实现数据持久化 1.1 场景介绍 用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。当用户希望有一个全局唯一存储的地方&#xff0c;可以采用用户首选项来进行存储。Preferences会将该…

单元测试-pytest框架实践

文章目录 1. 单元测试用例目录2. 自动化测试用例编写步骤3. 命名规则4. 环境安装5. pytest语法5.1 unittest与pytest对比5.2 pytest运行插件5.3 fixture5.4 装饰器 6. pytest.ini7. conftest.py8. 用例编写步骤8.1 按照以下方式检查用例 9. 单元测试示例10. 运行11. 覆盖率12. …

嵌入式 ARM Linux 系统构成(1):Bootloader层

目录 一、Bootloader 概述 1.1 核心作用 1.2 典型启动流程 二、ARM Bootloader 架构详解 2.1 多阶段启动设计 2.2 关键代码流程 2.3. Bootloader的加载过程 2.4. Bootloader的加载方式 2.5. Bootloader 的移植 三、常见的Bootloader介绍 3.1. U-Boot 3.2. vivi …

Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器

Ubuntu20.04双系统安装及软件安装&#xff08;九&#xff09;&#xff1a;谷歌浏览器 打开终端&#xff0c;下载谷歌浏览器软件包&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb下载完成后直接在原终端执行&#xff1a; sudo…

【五.LangChain技术与应用】【10.LangChain ChatPromptTemplate(下):复杂场景下的应用】

凌晨两点的西二旗,你盯着监控大屏上跳动的错误日志,智能客服系统在流量洪峰中像纸船一样摇晃。用户骂声塞满弹窗:“等了十分钟就这?”“刚才说的怎么不认了?”“我要人工!!”——这时候你需要的不只是ChatPromptTemplate,而是给对话系统装上航天级操控台。 一、模板组…

Django项目实战

1、安装django 查看包安装的位置 pip镜像源 镜像源名称镜像地址​清华源​https://pypi.tuna.tsinghua.edu.cn/simple​阿里云​https://mirrors.aliyun.com/pypi/simple​腾讯云​https://mirrors.cloud.tencent.com/pypi/simple​华为云​https://repo.huaweicloud.co…

【YOLO V5】目标检测 WSL2 AutoDL VScode SSH

【YOLO V5】目标检测 WSL2 AutoDL VScode SSH 前言整体思路理解向YOLO 目标检测完整流程 环境配置Anaconda 获取 YOLO 代码与预训练模型下载 YOLOv5 代码和预训练模型配置 YOLOV5 工程环境解压 YOLOv5 源代码 并 添加预训练模型调整依赖版本选择对应的 Python 解释器 数据集准备…