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

知识图谱_知识图谱 | 知识图谱做用户画像

导读:最近一直在思考怎么用知识图谱做推荐,但是目前能知道的内容都是基于路径的推荐和基于图特征的推荐,所以能不能换一个角度,探究一下用知识图谱怎么做用户画像,因为画像也是推荐系统重要的一部分。现在的知识图谱+推荐怎么做的传统的用户画像怎么做现在的知识图谱+推荐怎么做的?基于路径:可以理解成基于图谱的多路径召回,或者多路径推荐,然后根据路径的转移概率进行排序从而达到推荐的效果,基于路径比较适合简单的推...

weixin_28801659的博客 1460

C++ shared_ptr的线程安全性

C++ shared_ptr的线程安全性

GreatTang的博客 4272

神领物流-day01-项目概述

公司从2019年开始业务快速扩张,网点数量从138家扩展至540家,车辆从170台增长到800台。同时,原有的系统非常简单,比如车辆的调度靠人工操作、所有的货物分拣依靠人员,核心订单数据手动录入,人效非常低。随着业务不断演进,技术的不断提升,原有运输管理系统已无法满足现有快速扩展下的业务需求,但针对现有系统评估后发现,系统升级成本远高于重新研发。因此,公司决定基于现有业务体系进行重新构建,打造一套新的TMS运输系统,直接更替原有系统。

心飞为你飞 2255

【论文笔记】Beyond Low-frequency Information in Graph Convolutional Networks

文章目录1. Abstract2. Introduction低频和高频信号作用FAGCN怎么设计3. An Experimental Investigation4. Model4.1 filter定义4.2 Aggregation4.3 Problems of signal combination4.4 Spatial vision of FAGCN4.5 系数αijG\alpha_{i j}^{G}αijG​4.6 模型整体框架FAGCN的表达能力实验 本文发表在AAAI-21上 论文地址:https:

Running Snail 5602

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

JHU ICBM DTI Atlas纤维束模板介绍

JHU ICBM DTI atlas 纤维束的定位与功能介绍

machinelearning_er的博客 6423

shared_ptr线程安全性分析

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

jfkidear的专栏 510

i2c转串口驱动移植

i2c转串口驱动移植欢迎使用Markdown编辑器新的改变思路与使用方式合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用M

mars_Vessalius的博客 2276

台球 PCOL:极致物理还原的网页斯诺克引擎(附源码深度解析)

*完整源码地址**:[https://github.com/billiards/pcol-core](https://github.com/billiards/pcol-core)(包含详细文档与示例)通过这个项目,我们不仅创建了一个游戏,更构建了一个**可扩展的物理引擎框架**,为网页端复杂物理模拟开辟了新的可能性。**在线体验**:[https://pcol.billiards](https://pcol.billiards)(支持移动端触控操作)clone.velocity.x *= -0.92;

Loving_enjoy的博客 2797

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

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

m0_64014551的博客 345

开心消消乐

1)当点击一个1时,该1变被反转为0,同时相邻的上、下、左、右,以及左上、左下、右上、右下8个方向的1(如果存在1)均会自动反转为0;2)进一步地,一个位置上的1被反转为0时,与其相邻的8个方向的1(如果存在1)均会自动反转为0;上述样例中,四个角上的1均在中间的1的相邻8个方向上,因此只需要点击一次即可。给定一个N行M列的二维矩阵,矩阵中每个位置的数字取值为0或1。在上述4 * 4的矩阵中,只需要点击2次,即可将所有的1进行消除。接下来N行表示矩阵的初始值,每行均为M个数,取值范围[0,1]

面试高手的博客 2729

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万+

CAN(2)-GD32

GD32中CAN的特征。

小柚子的博客 553

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++ shared_ptr的线程安全问题

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

weixin_43850474的博客 3609

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

关于shared_ptr的线程安全性

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

程序员小董的专栏 123

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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、付费专栏及课程。

余额充值