当前位置: 首页 > news >正文

C++11中智能指针:shared_ptr的引用计数是线程安全的吗?

先说结论,shared_ptr的引用计数是线程安全的,但shared_ptr管理的对象本身不是线程安全的。


一、为什么引用计数是线程安全的?

shared_ptr内部有一个控制块(control block)

多个shared_ptr指向同一个对象时:

std::shared_ptr<int> p1(new int(10)); std::shared_ptr<int> p2=p1; 此时:控制块内的ref_conut=2

如果多个线程同时拷贝/销毁shared_ptr,为了避免竞态条件,标准库中使用原子操作(std::atomic<long>),所以引用计数的增加和减少是线程安全的。

二、为什么对象本身不是线程安全的?

假设:

std::shared_ptr<int> p(new int(0)); (*p)++; //两个线程都进行此操作

两个线程同时修改同一个对象,shared_ptr并没有加锁,会产生数据竞争吧,因此对象访问需要自己加锁。

例如:

//线程函数内加锁后再访问对象 std::mutex mx; std::lock_guard<std::mutex> lock(mx); (*p)++;

三、还有一个最大的误区

很多人学的比较浅的时候会误认为shared_ptr本身完全线程安全,其实线程安全的是多个shared_ptr指向同一个对象,因为有原子操作嘛

例如:

std::shared_ptr<int> p = make_shared<int>(10); thread1: auto p1=p; thread2: auto p2=p;

但如果是多个线程同时修改一个shared_ptr对象时,就需要同步机制啦

http://www.cnnetsun.cn/news/1333345.html

相关文章:

  • 不懂代码,我用AI编程给5岁女儿开发了个流光画板(带你一步一步设计一个属于自己的流光画板)
  • VScode快捷键
  • 小白从零开始勇闯人工智能:LangChain 入门指南(下)
  • AI时代的教育“外包”:中国家长将作业辅导交给机器
  • 2026年课程论文降AI率工具推荐:便宜好用才是硬道理
  • 软件系统安全赛初赛misc题-steganography wp
  • 东方仙盟・神识共创共生,智启万象—架构思路—未来之窗行业应用跨平台架构
  • linux-安装配置jdk mysql redis elasticsearch
  • Python 之程序截图的几种方式(含chromedriver下载链接)
  • android studio项目 gradle-xx-bin.zip下载失败或很慢的解决方法
  • AperiSolve 开源项目教程
  • 企业决策视角下微服务全链路性能瓶颈分析平台对比及实践指南
  • 【C语言】程序环境与预处理
  • SCUT_thesis项目:解决长章名换行后不居中的排版问题
  • PowerPlatformConnectors三大类型深度对比:自定义、认证与独立发布者连接器怎么选?
  • Pleaserun vs 手动编写init脚本:效率提升10倍的秘密
  • dbblog部署教程:Docker容器化部署与服务器配置全流程
  • AniVu BitTorrent下载功能深度测评:速度与稳定性全面测试
  • DC-TTS语音合成效果对比:LJ Speech与KSS数据集实测
  • 提升Haskell开发效率:ghcid高级功能与实用技巧
  • Saasify:让API变现从未如此简单!一站式实现API商业化的终极指南
  • Ikemen-GO开发者指南:用Go语言构建自定义格斗游戏引擎
  • GoMLX未来路线图:即将发布的5大令人期待的功能
  • lidar_camera_calib常见问题排查:从数据准备到结果验证的全流程避坑指南
  • 如何用tinygrad实现高效目标检测:YOLO和RetinaNet完整指南
  • 如何用tinygrad实现高效全局优化:从模拟退火到能量最小化的完整指南
  • 提升深度学习模型性能:tinygrad图像数据增强完全指南
  • 如何利用tinygrad数据流水线实现高效数据加载和预处理:从理论到实践
  • 为什么选择gorilla/csrf?深入解析Go语言中最受欢迎的CSRF防护库
  • 终极指南:Renovate如何通过智能机制实现实时安全更新防护