论 shared_ptr的线程安全

这篇具有很好参考价值的文章主要介绍了论 shared_ptr的线程安全。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

杂谈

今天有同事问我shared_ptr是线程更安全的吗?我当时脑子一懵,有点不确定。
但回过神来仔细一想这什么鸟问题,c++ stl里有线程安全的吗,shared_ptr 也不是针对线程安全而设计出来的呀,八竿子打不着的东西为什么会凑在一起问。

好像也就一个atmoic引用计数可以沾上边。

shared_ptr 是个啥

首先,shared_ptr 往简单里说就是一个带引用计数的原始指针,引用计数自动控制原始指针资源释放;
另外,引用技术使用的是原子变量,引用增加减少都是原子操作;

从以上来看,他解决的是内存释放所有权的问题,充其量用原子的引用计数保证了正常使用下的多线程下的一块内存的释放的安全。什么是正常使用后面细说。

shared_ptr 本身的使用就不是线程安全的

虽然原子操作保证了引用计数的线程安全,但是shared ptr管理的是原始指针+引用计数块,原始指针和引用技术块这两个类成员操作加在一起并不是原子的,参照一篇12年的博客示例,两个成员变量的多线程数据同步使用必然是要加同步控制的。

当然 cppreference原文,如果对同一块管理同一块内存的不同shared ptr实例,多线程所有的成员函数都是是线程安全的,这个和上面的区别在于一个

  • 多线程管理同一个内存的同一个shared_ptr (不安全)
  • 多线程管理同一个内存的不同shared_ptr (安全)

All member functions (including copy constructor and copy assignment) can be called by multiple threads on different instances of shared_ptr without additional synchronization even if these instances are copies and share ownership of the same object. If multiple threads of execution access the same instance of shared_ptr without synchronization and any of those accesses uses a non-const member function of shared_ptr then a data race will occur; the shared_ptr overloads of atomic functions can be used to prevent the data race.

多线程管理同一个内存的不同shared_ptr ,对于原始指针来说,是有两个指针变量指向对一块内存,不同线程下的只针对这两个指针变量没有数据共享,自然就不存在数据竞争;至于对于内存块的引用计数则因为原子操作保证不需要额外加同步。说的有点绕,注意区分。

这也是为什么share_ptr使用值传递是标准姿势,多线程无脑使用值传递可以省很多事,而不是引用传递或者全局变量共享。

另外针对非要 多线程管理同一个内存的同一个shared_ptr 这种情况,c++11有提供一系列atmoic自由函数来保证操作shared_ptr原子化
c++20 则废弃了这一系列自由函数,引入了std::atomic <std::shared_ptr > 来原子操作同一个shared_ptr。

shared_ptr 裸指针指向的内存没有线程安全

还是我上面说的,shared_ptr 只是对一块内存做了引用计数,而这一块内存操作并没有提供任何形式的线程安全措施。
原始内存数据如果不是线程安全的,加上了一个shared_ptr形式的外部封装管理就支持线程安全了?不现实的。

结论

shared_ptr本身不是线程安全的,他只能保证不存在数据竞争的情况下,保证析构线程安全;
另外shared_ptr并没有给管理的数据提供任何形式的同步,管理的数据是线程安全的,通过shared_ptr也是安全的,管理的数据不是线程安全,那就不是线程安全的文章来源地址https://www.toymoban.com/news/detail-480622.html

到了这里,关于论 shared_ptr的线程安全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++智能指针shared_ptr使用详解

    shared_ptr 是一个共享所有权的智能指针,允许多个指针指向同一个对象。 ​ shared_ptr 使用 引用计数 ,每一个shared_ptr的拷贝都指向相同的内存。每使用它一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,释放所指向的堆内存。shared_ptr内部的引用计数是安

    2024年02月07日
    浏览(42)
  • C++中智能指针(unique_ptr、shared_ptr、weak_ptr)详解

    C++中的智能指针是一种 RAII(资源获取即初始化)机制的实现, 它可以在对象不再需要时自动释放相关资源。 智能指针通过封装指针对象并提供一些额外的功能,如 引用计数、自动内存管理、避免内存泄漏等, 使得指针使用更加安全和方便。 在C++中,有三种主要类型的智能

    2023年04月11日
    浏览(40)
  • C++之weak_ptr与shared_ptr智能指针实例(一百九十五)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:An

    2024年02月09日
    浏览(62)
  • C++11 新特性 ⑥ | 智能指针 unique_ptr、shared_ptr 和 weak_ptr

    目录 1、引言 2、unique_ptr 3、shared_ptr 4、weak_ptr 5、shared_ptr循环引用问题(面试题)

    2024年02月09日
    浏览(49)
  • C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解

    目录 1、引言 2、什么是智能指针? 3、在Visual Studio中查看智能指针的源码实现 4、独占式指针unique_ptr 4.1、查看unique_ptr的源码实现片段 4.2、为什么unique_ptr的拷贝构造函数和复制函数被delete了?(面试题) 4.3、使用unique_ptr独占式智能指针的实例 5、共享式指针shared_ptr  5.1、查

    2024年02月08日
    浏览(44)
  • 深入理解和应用C++ std::shared_ptr别名构造函数

    在现代C++中,智能指针是一个极为重要的工具,尤其std::shared_ptr以其自动内存管理、引用计数和多线程安全性等特性深受开发者喜爱。其中一个不太常用但功能强大的构造方式是 别名构造函数 ,它允许我们创建一个共享相同底层对象但是指向其内部不同数据成员或子对象的

    2024年01月16日
    浏览(46)
  • 面试之快速学习C++11-完美转发,nullptr, shared_ptr,unique_ptr,weak_ptr,shared_from_this

    函数模版可以将自己的参数完美地转发给内部调用的其他函数。所谓完美,即不仅能准确地转发参数的值,还能保证被转发参数的左右值属性不变 引用折叠:如果任一引用为左值引用,则结果为左值引用,否则为右值引用。 上述 T 为int 。 那么整个为 int - int 回到完美转发,

    2024年02月12日
    浏览(37)
  • 【C++入门到精通】智能指针 shared_ptr 简介及C++模拟实现 [ C++入门 ]

    在 C++ 动态内存管理中,除了 auto_ptr 和 unique_ptr 之外,还有一种 智能指针 shared_ptr ,它可以让多个指针共享同一个动态资源,并且能够自动释放资源。 shared_ptr 通过引用计数的方式来管理内存,能够避免程序中出现悬空指针和内存泄漏等问题 。本文将介绍 shared_ptr 的简介和

    2024年01月22日
    浏览(49)
  • 为什么有些同事昨天还干的好好地,今天就离职了老板都留不住?

    HR时常会遭遇员工突发申请离职,对于一些核心岗位员工的离职,甚至没有时间去挽留。 但从心理学的角度来说,人的行为与意识是相互反应、互加映衬的。 也就是说,员工离职意识的产生与发展, 与他近期的行为息息相关。 与平时相比,他们在这些方面的行为变化较大。

    2024年02月05日
    浏览(69)
  • 面试官问我:线程锁导致的kafka客户端超时,如何解决?

    本文分享自华为云社区《线程锁导致的kafka客户端超时问题》,作者: 张俭 。 有一个环境的kafka client发送数据有部分超时,拓扑图也非常简单 我们先对客户端的环境及JVM情况进行了排查,从JVM所在的虚拟机到kafka server的网络正常,垃圾回收(GC)时间也在预期范围内,没有

    2024年02月03日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包