C++11新特性之线程std::atomic

ops/2024/12/13 9:08:46/

C++ std::atomic

C++ 中 std::atomic 的定义及功能

std::atomic 是 C++ 标准库中提供的一种模板类,主要用于实现 原子操作,以保证多线程环境下对共享变量的安全操作。它提供了一种无需使用互斥锁即可安全访问共享数据的机制,避免了竞争条件。

特点

  1. 线程安全:多个线程同时对同一变量进行读写操作时,std::atomic 保证操作的原子性。
  2. 性能优越:相比互斥锁,std::atomic 的性能更优,尤其在读多写少的情况下。
  3. 无锁实现:底层通常通过硬件支持的原子操作(如 CAS 操作)实现。

常用操作在这里插入代码片

  1. 原子加载与存储:load() 和 store()
  2. 原子交换:exchange()
  3. 比较并交换(CAS):compare_exchange_weak() 和 compare_exchange_strong()
  4. 原子加减:fetch_add()、fetch_sub()
  5. 内存顺序控制:memory_order

参考代码

下面展示一个使用 std::atomic 的完整例子,演示如何在多线程环境下对共享变量进行安全访问。

#include <iostream>
#include <atomic>
#include <thread>
#include <vector>// 全局原子变量
std::atomic<int> counter(0);// 工作线程函数
void increment(int num_iterations) {for (int i = 0; i < num_iterations; ++i) {// 原子递增操作counter.fetch_add(1, std::memory_order_relaxed);}
}int main() {const int num_threads = 10;         // 线程数const int num_iterations = 1000;   // 每个线程的迭代次数// 存储线程对象的容器std::vector<std::thread> threads;// 创建多个线程for (int i = 0; i < num_threads; ++i) {threads.emplace_back(increment, num_iterations);}// 等待所有线程完成for (auto& t : threads) {t.join();}// 输出最终计数值std::cout << "Final counter value: " << counter.load() << std::endl;return 0;
}

参考代码输出结果

Final counter value: 10000

代码解析

1. 原子变量定义

std::atomic<int> counter(0);

定义一个初始值为 0 的原子整型变量。

2. 原子操作

counter.fetch_add(1, std::memory_order_relaxed);

使用 fetch_add 原子递增,第二个参数指定内存顺序(这里使用 memory_order_relaxed 表示不对内存顺序进行额外约束)。

3. 多线程安全

每个线程对 counter 的递增操作是原子的,确保不会出现数据竞争。

4. 结果验证

主线程等待所有子线程完成后,打印 counter 的最终值,应为 num_threads * num_iterations。

输出示例

假设 num_threads = 10,num_iterations = 1000,则程序输出为:

Final counter value: 10000

这种方式比使用锁更高效,且避免了死锁等问题,是多线程编程中的重要工具。


http://www.ppmy.cn/ops/141497.html

相关文章

北斗卫星导航系统公开服务性能规范 3.0 版 | 2021 年 05 月 (BDS-OS-PS-3.0)

文章目录 版本变更记录引 言I 北斗系统概述空间段地面控制段用户段坐标系统时间系统北斗系统信息发布渠道版本变更记录 引 言 北斗卫星导航系统(简称北斗系统)按照“三步走”战略建设发展。 北斗一号系 统 1994 年启动建设,2000 年投入使用,采用有源定位体制,为中国用户提…

Harmonyos之深浅模式适配

Harmonyos之换肤功能 概述实现原理颜色适配颜色资源配置工具类编写界面代码编写适配效果 概述 深色模式&#xff08;Dark Mode&#xff09;又称之为暗色模式&#xff0c;是与日常应用使用过程中的浅色模式&#xff08;Light Mode&#xff09;相对应的一种UI主题。 换肤功能应…

Python 网络爬虫进阶2:突破数据采集的边界

五、数据清洗与预处理 在成功采集到大量数据后&#xff0c;这些数据往往是原始而杂乱的&#xff0c;需要进行清洗和预处理&#xff0c;以便后续的分析与应用。 &#xff08;一&#xff09;数据去重 网络爬虫可能会在不同的页面或多次爬取过程中获取到重复的数据。为了保证数…

Rust学习路线图

‌Rust是一种现代的系统编程语言&#xff0c;专注于性能、安全性和并发性。它在没有垃圾回收器的情况下实现了这些目标&#xff0c;使其成为许多其他语言不擅长的用例中的有用语言。其语法与C相似&#xff0c;但Rust在保持高性能的同时提供了更好的内存安全性。 获取路线图 你…

2024第六届金盾信安杯Web 详细题解

比赛一共4道Web题,比赛时只做出三道,那道文件上传没有做出来,所以这里是另外三道题的WP 分别是 fillllll_put hoverfly ssrf fillllll_put 涉及: 绕过exit() 死亡函数 php://filter 伪协议配合base64加解密 一句话木马 题目源码&#xff1a; c o n t e n t 参数在开头被…

如何通过变更让 PostgreSQL 翻车

在开发应用程序和维护其后台数据库集群的过程中&#xff0c;我们经常会遇到实践与理论、开发环境与生产环境之间的差异。其中一个典型的例子就是变更数据库中的列类型。 对于在 PostgreSQL&#xff08;及其他符合 SQL 标准的系统&#xff09;中变更列类型的常规操作&#xff0…

css 新学习css-one-line-upgrades

文章目录 html元素下划线可以设置距离和粗细原生的单选框&#xff0c;复选框&#xff0c;下拉框可以修改颜色页面内的元素区域内滚动不影响页面滚动 html元素下划线可以设置距离和粗细 a {/*距离*/text-underline-offset: 1em;/*粗细*/text-decoration-thickness: 5px; }原生的…

数据仓库-查看表和数据库的信息

查询表信息 使用系统表pg_tables查询数据库所有表的信息。 SELECT * FROM pg_tables;使用gsql的\d命令查询表结构。 示例&#xff1a;先创建表customer_t1并插入数据。 CREATE TABLE customer_t1 ( c_customer_sk integer, c_customer_id char(5)…