shared_ptr的线程安全性探讨

shared_ptr 智能指针 详解 shared_ptr详解 阅读详情

1. 问题陈述

在 一文详解C++11的三种智能指针中,我们详细探讨了C++11中提供的三种智能指针的应用场景以及shared_ptr的实现。今天需要探讨的是:shared_ptr的安全性。先上结论:不安全,需要加锁。

2. 过程剖析

在shared_ptr的实现中,需要在堆上开辟两块空间,一块用于指向裸指针、一块用于指向引用计数的对象。

假设现在对象a,类型为T,在主线程有个智能指针shared_ptr<T> G指向了这个对象,此时引用计数为1。然后开启子线程执行,但是执行了一半,只完成子线程中裸指针的指向,而引用计数没来得及指向就切换了。因此,此时引用计数仍然为1:

在这里插入图片描述
在切回主线程后,智能指针G不再指向a了。此时引用计数为0,对象a被释放:

在这里插入图片描述
此时再切换回子线程,而a已经被释放,此时智能指针就变成了悬空指针了:
在这里插入图片描述

因此可以看见,对于智能指针,在多线程得环境下需要加锁使用。

智能指针shared_ptr的线程安全、互斥锁 智能指针和线程安全的问题 <1> 智能指针shared_ptr本身(底层实现原理是引用计数)是线程安全的 智能指针的引用计数在手段上使用了atomic原子操作,只要shared_ptr在拷贝或赋值时增加引用,析构时减少引用就可以了。首先原子是线程安全的,所有智能指针在多线程下引用计数也是安全的,也就是... 阅读详情

相关推荐

shared_ptr线程安全性全面分析

正如boost文档所宣称的,boost为shared_ptr提供了与内置类型同级别的线程安全性。这包括:1. 同一个shared_ptr对象可以被多线程同时读取。2. 不同的shared_ptr对象可以被多线程同时修改成

shared_ptr 的线程安全性

多线程环境下,调用不同的 shared_ptr 实例的成员函数是不需要额外的同步手段的,即使这些 shared_ptr 管理的是相同的对象。多线程对于同一个 shared_ptr 实例的读操作(访问)可以保证线程安全;但对于同一个 shared_ptr 实例的写操作(改变一个 shared_ptr 指向的对象)则需要同步,否则会发生 race condition。即多个线程可以同时读取一个 shared_ptr 对象;多个线程同时读写一个 shared_ptr 对象,则需要加锁。

wjiaman 5140

ESP32蓝牙广播数据自定义指南:让你的设备更容易被手机发现

本文详细介绍了如何通过自定义ESP32蓝牙广播数据提升设备在手机端的可发现性。从广播数据结构、扫描响应优化到跨平台兼容性设置,提供了全面的技术指南和实战代码示例,帮助开发者解决智能硬件开发中的蓝牙连接难题。

weixin_29172201的博客 271

C++ shared_ptr的线程安全性

C++ shared_ptr的线程安全性

GreatTang的博客 4272

28GHz毫米波滤波器设计实战:用SynMatrix快速搞定SIW带通滤波器(附完整参数)

本文详细介绍了如何使用SynMatrix工具链高效设计28GHz SIW带通滤波器,涵盖智能参数预测、多物理场联合优化和加工误差补偿等核心技术。通过实战案例和完整参数模板,帮助射频工程师快速实现毫米波滤波器设计,显著提升工作效率并避免反复迭代。

weixin_29284657的博客 495

Sqlserver2012评估期已过问题解决(启动数据库服务报错1705都是同样的问题,数据库过期未激活)

一、背景: 因为之前安装sqlserver2012忘记输入序列号,如今出现评估期已过的问题,前几天忙活半天,才解决,发现网 上叙述都非常凌乱,并且仅仅有大意,有的非常难操作。所以把我操作的过程和大家交流分享: 一定要有序列号的输入。不然会有很多其它的麻烦出现: 二、问题解决: 第一步:进入SQL2012配置工具中的安装中心。 第二步:再进入左側维护选项界面,然后选择选择版本号升级。 ...

堂前燕的博客 3266

shared_ptr的线程安全性

shared_ptr的线程安全性 shared_ptr的reference count是线程安全的,但是指向的对象不是线程安全的! 本文链接:https://blog.youkuaiyun.com/D_Guco/article/details/80155323 shared_ptr的出现在某种程度上解放了c++程序员,c++11标准原生的支持了并发编程,在并发编程中shared...

DXT的博客 5372

华为OD机试 - 敌情监控 - 滑动窗口(Java 双机位C卷 200分)

说明 第一行第一个正整数5,表示敌人有5个营地,第二个正整数2,表示连续营地 的数量是2, 第3个正整数3, 表示后续会有3条查询的命令;接下来一行有 5个正整数,分别表示每个营地里开始的人的数,第1个营地开始有1个人,第 2个营地开始有2个人,第3个营地开始有2个人,第4个营地开始有3个人,第 5 个营地开始有3个人;第3条命令:Query 2 4 表示查询第2到第4个营地的总人数,结果:2+8=10 第一个输出是: 10,注意这里第3个营地人数在第2条命令中增加了6。第一行3个正整数:N K L。

学Java,找哪吒 765

shared_ptr线程安全性分析

shared_ptr线程安全性分析 2012-12-13 22:34 8668人阅读 评论(5) 收藏 举报  分类: C++(16)  版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] shared_ptr线程安全性分析 正如《STL源码剖析》所讲,“源码之前,了无秘密”。本文基于shared

jfkidear的专栏 510

最新Python爬虫实战(入门爬虫篇)——案例7:电影网站电影数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过Python爬虫技术,成功实现了对某电影网站Top250多页电影详细信息的批量爬取与Excel保存。代码采用模块化设计,包含分页请求构造、XPath+正则提取结构化信息、Excel数据持久化保存等完整流程。通过配置User-Agent等请求头信息,有效模拟浏览器行为以绕过豆瓣基础反爬策略。整个爬虫逻辑遵循"分页遍历 → 请求页面 → 解析HTML → 提取电影信息 → 保存到Excel"的标准流程,与主流静态网站爬取范式高度一致。

努力让自己发光,对的人才能迎着光而来 11万+

学Simulink--基础微电网场景实例:基于Simulink的微电网黑启动过程建模与仿真

黑启动(Black Start)是指在全系统停电(无电压、无频率)状态下,微电网依靠内部电源自主恢复供电的能力。🌩️典型场景主网长时间故障自然灾害导致区域停电计划检修后重启❗挑战无参考电压/频率 → 逆变器无法锁相负荷逐级投入 → 需避免过流/过压多电源协调 → 防止环流或失步✅黑启动成功标准在30 秒内恢复关键负荷供电电压/频率稳定在范围内无设备损坏或保护跳闸🎯本文目标:手把手教你使用 Simulink + Simscape + Stateflow 搭建。

amy_mhd的博客 200

【c++】shared_ptr是线程安全的吗?

【代码】【c++】shared_ptr是线程安全的吗?

m0_64014551的博客 345

论文阅读:Training language models to follow instructions with human feedback

这篇论文的目标是通过引入一种基于人类反馈的训练方法,来让语言模型更好地按照用户意图行事。这是因为大规模语言模型虽然强大,但有时候会生成不准确、有偏见或者对用户无帮助的内容,这说明它们和用户的需求之间存在一定的“错位”。论文提出了一个新方法,将 GPT-3 进行优化,称为示例数据与监督学习:让人类标注员生成一些正确行为的示例,并使用这些示例来初步优化模型。比较数据与奖励模型:让标注员比较模型生成的多个输出,并将其排序,从中学到模型输出的优劣规则。强化学习优化:基于这些规则,使用强化学习算法进一步优化模型。

CSPhD-winston的博客 1715

c++11总结15——shared_ptr在多线程下的安全性问题

1. 引用 boost官方文档中有如下结论: 1)同一个shared_ptr被多个线程“读”是安全的; 2)同一个shared_ptr被多个线程“写”是不安全的; 3)共享引用计数的不同的shared_ptr被多个线程”写“ 是安全的; 2. 线程安全 shared_ptr指针类有两个成员变量,一个是指向变量的指针;一个是资源被引用的次数,引用次数加减操作内部自动加锁解锁,是线程安全的。 2.1 引用计数 虽然引用计数存在于每一个shared_ptr对象中,但是实际上它是要跟随对象所管理

www_dong的博客 1万+

极智嘉嵌入式面试题及参考答案

IIC(Inter-Integrated Circuit)即集成电路总线,是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它仅使用两根线,即串行数据线 SDA 和串行时钟线 SCL,就能实现多个设备之间的通信,具有简单、高效、占用资源少等优点,广泛应用于各种嵌入式系统中。

大模型大数据攻城狮的专栏 921

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++ shared_ptr的线程安全问题

shared_ptr的线程安全问题 首先看看下面的图,这个图描述的就是对象、资源、引用计数之间的关系。 shared_ptr的线程安全问题需要从两个角度来分析: (1)从引用计数的角度来看: 虽然引用计数存在于每一个shared_ptr对象中,但是实际上它是要跟随对象所管理的资源。引用计数会随着指向这块资源的shared_ptr对象的增加而增加。因此引用计数是要指向同一块资源的所有的对象共享的,所以实际上引用计数在shared_ptr底层中是以指针的形式实现的,所有的对象通过指针访问同一块空间,从而实现共

weixin_43850474的博客 3609

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

关于shared_ptr的线程安全性

本文讨论了shared_ptr的线程安全性问题。指出多个线程同时读写同一个shared_ptr变量是不安全的,会导致"撕裂读"等问题。但不同线程持有指向同一对象的独立shared_ptr拷贝时,引用计数操作是线程安全的。然而,这并不保证对象内部的数据安全,若多个线程同时修改对象仍需加锁。此外,文章还对比了unique_ptr的使用方式,强调必须通过std::move转移所有权。总之,shared_ptr的线程安全是有限的,需根据具体使用场景采取适当措施。

程序员小董的专栏 123

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++的模板(十):shared_ptr的上锁问题

这个_M_ptr也是那个被引用计数管理的对象指针,在_Sp_counted_base及其派生类的管理范围内,如果引用计数归0,最后要销毁这个被管理的对象。执行完立即产生一个调度断点,那么别的线程可以在这个点上调度运行,如果凑巧也执行了一个 __shared_ptr ::swap(),并且是前面做到一半的那个__shared_ptr,那么它的执行导致_M_refcount被换走。加锁的办法,如果管理的是少量的大粒度的对象,可以使用单一的全局锁,如果管理的是大量的细粒度的对象,就要使用局部锁,对象粒度的锁。

aaasssdddd96的博客 1050

shared_ptr线程安全性

Thread Safety shared_ptr objects offer the same level of thread safety as built-in types. A shared_ptr instance can be "read" (accessed using only const operations) simultaneously by multiple thr

开心乐源的专栏 1447

boost::shared_ptr的多线程使用陷阱

可以多线程同时读一个shared_ptr, 也可以多线程同时写一个shared_ptr。 但多线程既读又写一个shared_ptr行为是未定义的。

我是个程序员 2086

C++: shared_ptr是线程安全的吗

对shared_ptr进行并发拷贝,对数据指针和控制块指针仅进行读取并复制,然后对引用计数进行递增,而引用计数增加是原子操作。因此是线程安全的。

wsqiangz的博客 1145

shared_ptr代码研究

shared_ptr被使用的很广泛,许多经典库使用share_ptr作为实现函数的接口类型使用。出share_ptr构建时:会构建出两个指针,一个用来指向维护的元素,一个用来指向元素的计数管理类对象。

春夜喜雨的专栏 1164

深入理解std::shared_ptr:原理、用法及其线程安全性

是 C++ 标准库中的一种智能指针,允许多个指针共享管理同一个对象的生命周期。它通过引用计数(reference count)来记录有多少个指针指向同一个对象,当引用计数为零时,会自动释放对象,避免手动管理内存带来的风险。// p1 引用计数为 1// p1 和 p2 都指向同一个 int,引用计数为 2// 输出 10p2.reset();// p2 被重置,引用计数减少为 1} // 作用域结束,p1 被销毁,引用计数为 0,对象被释放在上面的例子中,

萧戈的专栏 635
上一篇: 设计模式:饿汉式和懒汉式单例模式(C++实现)以及日志系统的实现
下一篇: 动态开点线段树(C++实现)
zsiming
博客等级 码龄7年 43粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值