首页 > 其他分享 >线程安全的对象生命期管理

线程安全的对象生命期管理

时间:2023-09-01 19:56:59浏览次数:45  
标签:对象 weak 线程 析构 shared 生命期 ptr

 

  • 编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的mutex保护。
  • race condition:在即将析构一个对象时,从何而知此刻是否有别的线程正在执行该对象的成员函数?如何保证在执行成员函数期间,对象不会在另一个线程被析构?在调用某个对象的成员函数之前如何得知这个对象还活着?它的析构函数会不会碰巧执行到一半?
  • 对象构造要做到线程安全,唯一的要求就是在构造期间不要泄漏this指针。
  • 作为class数据乘员的Mutex只能用于同步本class的其他数据成员读写,它不能安全的保护析构。因为Mutex的生命周期最多与对象一样长,而析构函动作可说是发生在对象身故之后(或者身故之时)。涉及到析构函数的多线程 会发生race condition。另外同时读写一个class的两个对象,有潜在的死锁可能。
  • 观察者模式中 observable 和 observer的双向耦合时,怎么确定对方是否还存在。把Observer* 替换为weak_ptr<Observer> 
  • 神器shared_ptr/weak_ptr。shared_ptr是强引用,只要有一个指向x对象的shared_ptr存在,该对象就不会析构。当指向x的最后一个shared_ptr析构或者reset()的时候,x保证被销毁。weak_ptr不控制对象的生命期,但是它知道对象是否还活着。如果对象还活着,那么它可以提升为有效的shared_ptr(提升行为是线程安全的)。shared_ptr/weak_ptr在主流平台上是原子操作,没有用锁,性能不俗。shared_ptr的引用计数本身是线程安全的,它所管理的对象不是线程安全的,要在多个线程访问同一个shared_ptr,正确的做法是用mutex保护。
  • 智能指针的优势:C++利用智能指针达到的效果是:一旦对象不再被引用,系统刻不容缓,立刻回收内存。
  • 指向对象的原始指针是坏的,尤其是暴露给别的线程时。
  • 统一使用shared_ptr/weak_ptr来管理对象的生命期,在多线程中尤其重要

标签:对象,weak,线程,析构,shared,生命期,ptr
From: https://www.cnblogs.com/wuyun--wy/p/17670203.html

相关文章

  • JavaScript—内置对象
    内置对象是什么JavaScript中的对象分为三种:自定义对象,内置对象和浏览器对象。前面两种对象是JS基础内容,属于ECMAScript;第三个浏览器对象属于我们JS独有的。内置对象就是指JS语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性和方法)。内置......
  • JavaScript—对象
    为什么需要对象保存一个值时,可以使用变量,保存多个值(一组值)时,可以使用数组。如果要保存一个人的完整信息(信息面板)呢?在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。对象是由属性和方法组成。属性:事物的特征,在对象中用......
  • ConcurrentHashMap是如何保证线程安全的
    ConcurrentHashMap是concurrent包下的一个集合类。它是线程安全的哈希表。它是通过“分段锁”来实现多线程下的安全问题。它将哈希表分成了不同的段内使用了可重入锁(ReentrantLock ),不同线程只在一个段内存在线程的竞争。它不会对整个哈希表加锁。|初始化数据结构时的线程安全Has......
  • Java中对象创建的几种方式
    Java中对象创建的几种方式本文记录Java创建对象的六种方式,详细内容请查看代码测试对象粘贴复制即可,配合TestPeople食用importjava.io.Serializable;/***@authorunknown*@since2023/09/0116:09*/publicclassPeopleimplementsCloneable,Serializable{......
  • 从零开始学习jQuery (五) 事件与事件对象
    [导读] 一摘要事件是脚本编程的灵魂所以本章内容也是jQuery学习的重点本文将对jQuery中的事件处理以及事件对象进行详细的讲解二前言本篇文章是至今为止本系列内容最多的一篇,足以可见其重要性大家反映要多一.摘要事件是脚本编程的灵魂.所以本章内容也是jQuery学习的重......
  • 每天一道面试题:对象引用及垃圾回收
    先来看题目 (多选)下面哪些描述是正确的:()【文章末尾有答案】1publicclassTest{2publicstaticclassA{3privateBref;4publicvoidsetB(Bb){5ref=b;6}7}8publicstaticClassB{9......
  • 关于处理 vue data中对象或数组中响应式数据的注意点
    vue2中针对对象中的响应式数据,如果要想修改他们,只能通过监听的特性实现。不能直接赋值。在vue2源码中,计算属性和watch的实现方式是一样的,都具有监听响应式对象或数组中的数据的功能。区别就是,计算属性具有缓存机制。除此之外,还可以直接使用this.$set(obj,key:String,value......
  • c++并发编程实战-第2章 线程管控-读书笔记
    线程的基本管控每个应用程序都至少拥有一个线程,即运行main函数的线程,称为主线程,它由c++运行时系统启动。我们可以在软件运行中产生其他线程,它们以指定的函数作为入口函数。当main函数返回后,程序会退出;同样,当入口函数返回后,与之对应的线程结束。发起线程线程是通过构造std::thre......
  • Java是一种广泛使用的面向对象编程语言
    Java是一种广泛使用的面向对象编程语言,具有以下特性:平台无关性:Java语言编写的程序可以在不同的操作系统和硬件平台上运行,因为Java语言通过Java虚拟机(JVM)实现了平台无关性。面向对象:Java是一种完全面向对象的编程语言,支持封装、继承和多态等面向对象的基本特性。强类型语言:Java是一......
  • 面向对象
    1、面向过程  以函数(方法)为最小单位,数据独立于函数之外,以过程步骤为主,考虑怎么做,他是一个执行者。2、面向对象 以类、对象为最小单位,类包括:数据+方法,以对象为主,考虑谁来做,谁能做,指挥者。3、面向对象的基本特征 封装,继承,多态。4、类和对象 1、类    类是......