news 2026/5/5 13:49:09

C++ 原子变量与引用计数类的派生类实现解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 原子变量与引用计数类的派生类实现解析

C++ 原子变量与引用计数类的派生类实现解析

核心结论

在C++中,原子变量(std::atomic)是实现线程安全引用计数类(如shared_ptr)的关键技术。原子变量通过原子操作(如CAS循环)确保引用计数的修改是不可分割的,从而避免多线程环境下的数据竞争问题。以下是核心实现要点:

  1. 原子变量的使用

    • 类型定义‌:std::atomic<std::size_t>用于存储引用计数,确保计数操作的原子性。
    • 内存序控制‌:使用std::memory_order_acq_rel确保计数操作的可见性和顺序性。
  2. 引用计数类的派生实现

    • 控制块设计‌:独立的控制块(包含强引用计数和弱引用计数)管理对象生命周期。
    • 关键操作‌:
      • 构造函数‌:初始化计数器为1,关联对象。
      • 析构函数‌:释放资源(计数归零时删除对象)。
      • 拷贝/移动操作‌:通过原子操作更新计数器。
  3. 线程安全机制

    • 原子操作‌:fetch_subfetch_add实现线程安全的计数修改。
    • 内存模型‌:std::memory_order_acq_rel确保操作的顺序性和可见性。

实现示例

cppCopy Code

template<typename T> class SafeRefCount { private: T* ptr; std::atomic<std::size_t>* ref_count; void release() { if (ref_count && ref_count->fetch_sub(1, std::memory_order_acq_rel) == 1) { delete ptr; delete ref_count; } } public: SafeRefCount(T* p) : ptr(p), ref_count(new std::atomic<std::size_t>(1)) {} ~SafeRefCount() { release(); } SafeRefCount(const SafeRefCount& other) : ptr(other.ptr), ref_count(other.ref_count) { if (ref_count) ref_count->fetch_add(1, std::memory_order_relaxed); } SafeRefCount& operator=(const SafeRefCount& other) { if (this != &other) { release(); ptr = other.ptr; ref_count = other.ref_count; if (ref_count) ref_count->fetch_add(1, std::memory_order_relaxed); } return *this; } };

关键注意事项

  • 性能优化‌:原子操作可能引入开销,需权衡线程安全与性能。

  • 内存模型‌:std::memory_order_acq_rel提供强同步,但可能影响吞吐量。

建议在实际项目中,优先使用std::shared_ptr,其内部实现经过高度优化。若需自定义,务必严格遵循原子操作规范,避免竞态条件。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 9:51:16

性能测试怎么做?看完这篇文章你就懂了

性能测试流程介绍&#xff1a; 01 流程一 — 问清性能测试需求 1、新系统能力验证 2、明确客户需求 3、找出系统性能瓶颈 4、稳定性验证&#xff08;强度测试&#xff09; 02 流程二 — 了解系统结构 系统架构对于测试新手来是最难的&#xff1b;先来了解系统所使用的技…

作者头像 李华
网站建设 2026/4/30 18:48:07

Ros2主题的:发布、订阅 demo

1、创建文件夹、创建功能包 # 创建文件夹 mkdir ros2_dir# 进入文件夹, 创建src, 进入src cd ros2_dir mkdir src cd src# 创建功能包 ros2 pkg create pub_sub_pkg --build-type ament_cmake --dependencies rclcpp std_msgs 2、创建节点&#xff1a;发布主题 publisher_membe…

作者头像 李华
网站建设 2026/4/23 14:46:10

GNSS位移监测站:配备扼流圈天线和磁性吸波材料

GNSS位移监测站配备扼流圈天线和磁性吸波材料&#xff0c;可显著提升监测精度与抗干扰能力&#xff0c;适用于复杂环境下的高精度位移监测需求。以下是具体分析&#xff1a;一、核心功能与优势高精度定位毫米级精度&#xff1a;通过差分RTK技术&#xff0c;结合扼流圈天线与磁性…

作者头像 李华
网站建设 2026/5/1 9:50:38

LobeChat可视化图表说明文字生成

LobeChat&#xff1a;构建可扩展、多模型兼容的开源AI聊天平台 在大语言模型&#xff08;LLM&#xff09;席卷全球的今天&#xff0c;人们早已不再满足于“能不能对话”&#xff0c;而是追问&#xff1a;“能否更安全&#xff1f;更可控&#xff1f;更灵活&#xff1f;”虽然像…

作者头像 李华
网站建设 2026/4/22 2:59:27

基于单片机的智能衣柜

基于单片机的智能衣柜设计 第一章 绪论 传统衣柜仅作为衣物收纳载体&#xff0c;存在诸多痛点&#xff1a;梅雨季或潮湿环境下衣物易发霉&#xff08;据统计&#xff0c;南方地区因潮湿导致的衣物霉变率达35%&#xff09;、长期封闭产生异味、衣物堆积后查找困难&#xff08;单…

作者头像 李华