news 2026/6/10 19:55:23

[量化]《深入理解 shared_ptr 的线程安全:原理、误区与最佳实践》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[量化]《深入理解 shared_ptr 的线程安全:原理、误区与最佳实践》

引言

std::shared_ptr` 是 C++ 中最常用的智能指针之一,但其线程安全语义常常被误解。本文从引用计数的原子操作出发,详细分析 `shared_ptr` 哪些操作是线程安全的、哪些不是,并给出正确的多线程使用模式,帮助你避免数据竞争和未定义行为。适用于 C++11 及以上标准。

1.shared_ptr 的线程安全:

“部分安全”原则`,shared_ptr` 的线程安全可以总结为以下三条核心规则:

1.1 引用计数的操作是线程安全的

拷贝构造、拷贝赋值、析构。对引用计数的修改(递增/递减)使用原子操作,多个线程同时操作**不同的 `shared_ptr` 对象**(即使它们指向同一资源)是安全的。
底层保证。控制块中的 `ref_count` 和 `weak_count` 均为原子类型,所有修改操作通过`fetch_add`/`fetch_sub` 等原子原语完成。

 1.2 指向的资源本身不是线程安全的

`shared_ptr` 只管理内存生命周期,**不提供任何对资源内容的同步保护**。
- 多线程同时读写所管理的对象需要额外的同步(如 `std::mutex`、`std::atomic` 或读写锁)

1.3 同一个 shared_ptr 对象被多线程同时修改是不安全的

- 如果有多个线程对**同一个** `shared_ptr` 对象调用**非 const 成员函数**(如 `reset()`、`operator=`、`swap()`),将产生数据竞争,即使这些操作涉及引用计数修改,也不能保证线程安全。

```cpp
std::shared_ptr<int> global_sp = std::make_shared<int>(42);

// 线程 A
global_sp = std::make_shared<int>(100);   // 写操作

// 线程 B
auto sp2 = global_sp;                     // 读操作
// 数据竞争!同一对象同时被读写
```

> **结论**:可以把 `shared_ptr` 视为一个“小的资源句柄”,它的引用计数部分是线程安全的,但句柄本身的赋值(即改变它指向哪个控制块)不是线程安全的。

---

2.典型实现原理与引用计数

2.1 控制块与内存布局

`shared_ptr` 通常包含两个指针:一个指向所管理的对象,另一个指向**控制块**(control block)

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

[量化]《Linux 用户态与内核态深度解析:从特权级到切换开销》

# 理解 Linux 用户态与内核态:区别、切换机制与性能优化 > 你是否想过:为什么程序频繁调用 `read`/`write` 会变慢?系统调用到底有多大的开销?本文从 CPU 特权级出发,深入讲解 Linux 用户态与内核态的区别、切换流程、成本分析以及如何减少不必要的切换。读完本文,你…

作者头像 李华
网站建设 2026/6/10 19:53:13

实战房价竞赛

下载数据集 # 导入所需的库 import hashlib # 用于计算文件的SHA-1哈希值&#xff0c;验证文件完整性 import os # 用于操作系统路径、目录等操作 import tarfile # 用于处理.tar或.gz压缩文件 import zipfile # 用于处理.zip压缩文件 import reques…

作者头像 李华
网站建设 2026/6/10 19:53:06

bgp策略

需求&#xff1a;1、使用PreVal策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、使用AS_Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3、配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4、使用Local Preference策略&#xff0c;确保R1通过R2到达192.…

作者头像 李华
网站建设 2026/6/10 19:52:24

Web分布式网站架构之-Squid缓存【20260608】001篇

文章目录 一、Squid 是啥? 二、代理的三种类型(重点) 三、怎么装 Squid? 四、两种常见代理怎么搭? 1️⃣ 传统代理 2️⃣ 透明代理(稍难) 五、ACL 访问控制(超实用) 用法两步走: 六、日志分析工具 SARG 七、一句话总结 这份文档讲的是 Squid 代理服务器 的入门到实战…

作者头像 李华
网站建设 2026/6/10 19:48:05

2026网盘隐私大测评!哪家文件加密最靠谱?高安全网盘横向盘点

日常存照片、证件资料、工作合同、学习文档&#xff0c;大家都离不开网盘。但很多人在2026年依然纠结&#xff1a;面对勒索病毒变种和复杂的数据环境&#xff0c;哪款网盘私密加密更靠谱&#xff0c;能真正保护私人文件、避免数据隐私风险&#xff1f; 2026年主流网盘层出不穷…

作者头像 李华
网站建设 2026/6/10 19:48:00

Spring AI实战:快速集成阿里通义千问

一、背景&#xff1a;AI时代&#xff0c;Java开发者如何不掉队&#xff1f; 最近AI Agent概念火得一塌糊涂&#xff0c;ChatGPT、Claude等大模型能写代码、能查资料&#xff0c;甚至能调用外部工具。但作为Java后端开发&#xff0c;我们最关心的是&#xff1a;如何把AI能力集成…

作者头像 李华