C++并发编程: std::atomic对指针进行操作

std::atomic 对指针进行运算的用途

std::atomic 提供了一种在多线程环境中安全地操作指针的方法。这对于实现线程安全的指针管理、动态内存分配、链表操作等场景非常有用。通过使用std::atomic对指针进行运算,可以确保指针操作的原子性和多线程安全性。

常见用途

  1. 线程安全的指针管理:在多线程环境下,安全地分配和释放内存。
  2. 链表操作:安全地插入和删除链表节点。
  3. 同步数据结构:实现线程安全的数据结构,如队列、栈等。
  4. 原子指针的自增和自减:用于实现计数器或迭代器。

示例代码

以下是一些使用std::atomic对指针进行操作的示例代码。

1. 线程安全的动态内存管理
#include <iostream>
#include <thread>
#include <atomic>
#include <vector>std::atomic<int*> shared_ptr(nullptr);void thread_func() {int* local_ptr = new int(42);std::atomic_store(&shared_ptr, local_ptr); // 原子地存储指针int* loaded_ptr = std::atomic_load(&shared_ptr); // 原子地加载指针if (loaded_ptr != nullptr) {std::cout << "Loaded value: " << *loaded_ptr << std::endl;delete loaded_ptr;}
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 10; ++i) {threads.emplace_back(thread_func);}for (auto& t : threads) {t.join();}return 0;
}

代码说明
  1. shared_ptr:一个std::atomic<int*>类型的原子指针,用于在多线程之间共享指针。
  2. thread_func
    • 创建一个局部指针local_ptr,并使用std::atomic_store原子地将指针存储到shared_ptr中。
    • 使用std::atomic_load原子地从shared_ptr中加载指针,并在使用后删除指针。
  3. main
    • 创建多个线程,每个线程执行thread_func
    • 等待所有线程完成。
2. 线程安全的链表操作
#include <iostream>
#include <thread>
#include <atomic>
#include <memory>struct Node {int data;std::atomic<Node*> next;Node(int value) : data(value), next(nullptr) {}
};std::atomic<Node*> head(nullptr);void insert_node(int value) {Node* new_node = new Node(value);Node* current_head = std::atomic_load(&head);while (true) {new_node->next = current_head;if (std::atomic_compare_exchange_weak(&head, &current_head, new_node)) {break; // 插入成功}}
}void print_list() {Node* current = std::atomic_load(&head);while (current != nullptr) {std::cout << current->data << " -> ";current = current->next.load();}std::cout << "nullptr" << std::endl;
}void delete_list() {Node* current = std::atomic_load(&head);while (current != nullptr) {Node* next = current->next.load();delete current;current = next;}std::atomic_store(&head, nullptr);
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 10; ++i) {threads.emplace_back(insert_node, i);}for (auto& t : threads) {t.join();}print_list();delete_list();return 0;
}

代码说明
  1. Node 结构体:表示链表节点,包含一个整数data和一个原子指针next
  2. head:一个std::atomic<Node*>类型的原子指针,用于表示链表的头部。
  3. insert_node
    • 创建一个新节点new_node
    • 使用std::atomic_loadstd::atomic_compare_exchange_weak原子地将新节点插入链表头部。
  4. print_list:遍历链表并打印节点值。
  5. delete_list:遍历链表并删除所有节点。
  6. main
    • 创建多个线程,每个线程插入一个节点。
    • 等待所有线程完成。
    • 打印链表。
    • 删除链表。

总结

通过使用std::atomic对指针进行操作,可以确保多线程环境下指针操作的原子性和安全性。这在动态内存管理、链表操作和其他需要同步的场景中非常有用。std::atomic提供了多种原子操作,如loadstorecompare_exchange_weak等,这些操作可以确保在多线程环境下安全地进行指针操作。

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

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

相关文章

2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码

系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块&#xff0c;旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项&#xff0c;企业可实现精细化管理&#xff0c;提升运营效…

数据增强的几大方式

1. 随机擦除(Random Erasing) 说明 随机在图像中选取一个矩形区域&#xff0c;将其像素值随机化或设为零&#xff0c;以增加模型对部分缺失信息的鲁棒性。 import numpy as np import cv2def random_erasing(image, sl0.02, sh0.2, r10.3):h, w, _ image.shapearea h * wta…

leecode416.分割等和子集

这道题目看了题解把题目转化为01背包问题才恍然大悟&#xff0c;sum为数组的总和&#xff0c;背包容量为sum/2&#xff0c;价值和背包重量都为nums[i]&#xff0c;由于价值和背包重量都为nums[i]&#xff0c;那么容量为sum/2的背包最多只能获得最大的价值是sum/2&#xff0c;所…

首次下载steam更新速度慢解决方法

下载免费的加速器&#xff0c;在加速器的steam商店加速页面→加速后页面上方的区服选择 &#xff08;香港移动&#xff09;→双箭头→改为登录异常专用→在下部的登录修复进入steam更新 就好了&#xff0c;亲测有效

芯片级IO (Pad) Ring IP Checklist

SoC top顶层数字后端实现都会涉及到IO Ring &#xff08;PAD Ring&#xff09;的设计。这里面包括VDD IO,VDDIO IO, Signal IO, Corner IO&#xff0c;Filler IO&#xff0c;IO power cut cell等等。 数字后端零基础入门系列 | Innovus零基础LAB学习Day2 数字IC后端实现TOP F…

通过算法识别运行过程中产生的常见缺陷,及时处理,避免运行故障,影响正常作业的智慧快消开源了

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。 基于多年的深度…

μC/OS-Ⅱ源码学习(7)---软件定时器

快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) μC/OS-Ⅱ源码学习(3)---事件模型 μC/OS-Ⅱ源码学习(4)---信号量 μC/OS-Ⅱ源码学习(5)---消息队列 μC/OS-Ⅱ源码学习(6)---事件标志组 本文进一…

CRYPTO密码学

加解密算法/编码 编码base家族unicodeASCII哈希算法MD5 Message Digest AlgorithmnSM3SHA-3GBGB18030GB2312GBKutf家族恺撒二进制分区法DSADSSCRC32校验对称非对称gbk编码h264SEA初探smc动态代码保护四方密码曼彻斯特编码剖析基本概念什么是编码?什么是加密与解密寻找银弹-有没…

【前端】深入探讨 JavaScript 的 reduce() 方法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是 reduce() 方法&#xff1f;定义与核心概念语法结构参数解析返回值 &#x1f4af;基础用法与示例示例 1&#xff1a;计算数组元素的和解析 示例 2&#xff1a;统计…

postman关联接口用于登录(验证码会变情况)

目录 一、介绍 二、操作步骤 (一)Fiddler抓取到登录信息 (二)postman发送请求 新建请求一&#xff1a;登录值请求 (三)易变值赋值固定住 新建请求二&#xff1a;易变值验证码(uuid)请求 切换到请求一里面进行赋值绑定 一、介绍 接口有两种形式&#xff0c;一种是单…

SSC338Q SigmaStar 摄像头主控芯片

SSC338Q 是一款由 SigmaStar&#xff08;星宸科技&#xff09;推出的高集成度多媒体系统级芯片&#xff08;SoC&#xff09;&#xff0c;广泛应用于高分辨率智能视频录制设备&#xff0c;如 IP 摄像机、车载摄像机和 USB 摄像机。 处理器&#xff1a; CPU&#xff1a;32 位双…

苹果将推出超薄和折叠款iPhone,2024年带来哪些变化?

苹果公司&#xff08;AAPL&#xff09;近日宣布&#xff0c;将对其iPhone系列进行重大升级&#xff0c;以应对当前市场中的销量压力。这一改变&#xff0c;或许会为苹果带来新的增长动力。那么&#xff0c;苹果的2024年新iPhone究竟有哪些亮点呢&#xff1f;下面我们来详细了解…

QML 粒子模拟

粒子模拟 粒子模拟 粒子模拟的核心是粒子系统&#xff08;ParticleSystem&#xff09;, 它控制共享时间线。一个粒子使用发射器元素&#xff08;Emitter&#xff09;发射&#xff0c; 使用粒子画笔&#xff08;ParticlePainter&#xff09;实现可视化&#xff0c; 它可以是一张…

Java中的Consumer接口应该如何使用(通俗易懂图解)

应用场景&#xff1a; 第一次程序员A写好了个基础的遍历方法&#xff1a; public class Demo1 {public static void main(String[] args) {//假设main方法为程序员B写的,此时需要去调用A写好的一个遍历方法//1.如果此时B突然发现想将字符串以小写的形式打印出来&#xff0c;则…

WPF+MVVM案例实战与特效(四十四)- WPF多语言支持全解析:轻松实现国际化应用

文章目录 1、引言2、案例效果3、准备工作1、创建项目结构2、代码实现1、语言资源2、资源引用3、页面功能4、实现效果3、总结1、引言 在当今全球化的背景下,开发一个多语言支持的应用程序变得越来越重要。WPF提供了强大的功能来实现应用程序的国际化和本地化。本文将详细介绍如…

Java爬虫大冒险:如何征服1688商品搜索之巅

在这个信息爆炸的时代&#xff0c;数据就是力量。对于电商平台而言&#xff0c;数据更是金矿。今天&#xff0c;我们要踏上一场Java爬虫的冒险之旅&#xff0c;目标是征服1688这个B2B电商巨头&#xff0c;获取按关键字搜索的商品信息。这不仅是技术的挑战&#xff0c;更是智慧的…

《Django 5 By Example》读后感

一、 为什么选择这本书&#xff1f; 本人的工作方向为Python Web方向&#xff0c;想了解下今年该方向有哪些新书出版&#xff0c;遂上packt出版社网站上看了看&#xff0c;发现这本书出版时间比较新(2024年9月)&#xff0c;那就它了。 从2024年11月11日至2024年12月18日期间&…

TouchGFX移植(3)增加SDRAM驱动

一&#xff09;SDRAM驱动增加到工程中 1&#xff09;加入驱动sdram.c文件&#xff0c;文件在上节课里有源代码。 2&#xff09;在fmc.c文件里指定位置增加代码 SDRAM_Init();另外需要包含文件&#xff1a;#include “sdram.h” /* USER CODE BEGIN 0 / #include “sdram.h” …

Apache Kylin最简单的解析、了解

官网&#xff1a;Overview | Apache Kylin 一、Apache Kylin是什么&#xff1f; 由中国团队研发具有浓厚的中国韵味&#xff0c;使用神兽麒麟&#xff08;kylin&#xff09;为名 的一个OLAP多维数据分析引擎:&#xff08;据官方给出的数据&#xff09; 亚秒级响应&#xff…

【Token】校验、会话技术、登录请求、拦截器【期末实训】实战项目学生和班级管理系统\Day15-后端Web实战(登录认证)\讲义

登录认证 在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录认证。 最终我们要实现…