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

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

解决对象构造的线程安全

  • 当我们需要动态分配对象时( 懒加载 ), 如果在多个线程中运行这一部分代码,可能出现多次初始化的问题。

单例模式

c++ 11 之后static 变量的初始化是线程安全的。可以利用静态变量来实现单例模式,解决重复初始化的问题。

std::call_once

个人感觉不够优美,要传递一个flag 来标识初始化情况

线程访问未初始化的资源

比如在Thread类中,std::thread被构造之后立即开始执行线程中函数,然而函数中访问的资源可能还没有被初始化。

解决方案:

  1. 成员初始化列表控制构造顺序
  2. 手动控制线程函数的运行
  3. 不要泄露this指针

解决对象析构的线程安全

  • 对象的析构问题是一个比较特别的线程安全问题,在我们析构这个对象的时候如何得知有没有其他线程在使用它?在我们使用这个对象的时候又如何保证它没有被析构(成为野指针)?

解决方案

使用shared_ptr 和 unique_ptr 控制生命周期,使用自定义的析构函数来提供适配性。

使用weak_ptr 探测shared_ptr的生命周期, 避免环状引用

注意

shared_ptr 的引用计数是安全无锁的,然而它本身需要加锁(有两个指针,内部是二段式操作)。

使用shared_from_this

对独有的资源使用std::move + std::unique_ptr

原文地址:https://www.cnblogs.com/joeylee97/p/8970992.html

时间: 2024-10-11 18:58:31

线程安全的对象生命期管理的相关文章

面向服务开发中三层架构中事务单元的生命期管理

    经典的三层分层结构,控制层(Control),服务层(Service),持久层(Repository)应用广泛,在面向服务(SOA)的架构中,配合DI.IOC实现开放灵活的技术架构.     SOA中,Respository面向数据访问,提供访问数据库.文件.或其他业务接口提供持久能力.Service面向业务,提供访问业务功能的接口,使用领域模型描述业务需求,方便产品人员.需求人员和客户沟通理解业务流程.最后,Control面向业务流程整合,提供基于事务的需求实现.     事务,用需求

笔记-线程安全的生命期管理

当析构函数遇到多线程,当一个对象能被多个线程同时看到,那么对象的销毁时机就变得模糊不清了,可能出现多种竞争条件race condition: 在即将析构一个对象时,如何得知此刻是  否有别的线程正在执行该对象的成员函数 如何保证在执行成员函数期间,对象不会在另一个线程被析构 在调用某个对象的成员函数之前,如何得知这个对象还活着? 它的析构函数不会碰巧执行到一半? 记住share_ptr的用法. 线程安全:三个条件.  多个线程同时访问时,其表现出正确的行为;无论os如何调度这些线程,无论这些线程

C++构造析构函数生命期及对象生命期

使用 JointCode.Shuttle 管理远程服务对象的生命期

JointCode.Shuttle 是一个用于进程内 AppDomain 间通信的服务架构(不支持跨进程). 一般情况下,在进行跨 AppDomain 调用时,大部分人选择使用运行时库默认提供的.基于 MarshalByrefObject 类继承的通信机制.代码也很简单,例如: 1 namespace JoitCode.Shuttle.SimpleSample 2 { 3 public class MyService : MarshalByRefObject 4 { 5 public void

Android百日程序: Fragment动态管理和生命期

之前写过Fragment使用的程序,Fragment可以静态,也可以动态载入内存中的,这一章进一步看看如何动态地更换Fragment和看看Fragment生命期都有什么函数. 本章利用响应菜单点击事件,轮流载入不同的Fragment,显示不同的界面,效果如下: 开始的是没有载入Fragmen为空白: 点击菜单的NEXT FRAGMENT VIEW,就进入下一个界面,载入两个: 继续点击显示Fragment 1: 继续点击,显示Fragment2: 然后就是循环了: 如此循环显示不同画面. 一 首

ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很长的路要走.今天,我们就研究一下在事件处理器中,对象生命周期的管理问题. 事实上,不仅仅是在事件处理器中,我们需要关心对象的生命周期,在整个ASP.NET Core Web API的应用程序里,我们需要理解并仔细推敲被注册到IoC容器中的服务,它们的生命周期应该是个怎样的情形,这也是服务端应用程序设

[翻译]理解C#对象生命周期

看到网上的一篇讲C#对象生命周期(Object Lifetime)的文章,通俗易懂,而且有图,很适合初学者学习,就翻译过来了.后来发现这是Pro C# 2010 and the .NET 4 Platform的第八章中的一部分.(感谢 大乖乖 提醒).文中的专业名词第一次出现时,括号里会标注对应的英文单词. 请尊重作者劳动,转载请注明出处:http://www.cnblogs.com/Jack47/archive/2012/11/14/2770748.html. ----2012年11月15日修

block没那么难(三):block和对象的内存管理

本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 在上一篇文章中,我们讲了很多关于 block 和基础变量的内存管理,接着我们聊聊 block 和对象的内存管理,如 block 经常会碰到的循环引用问题等等. 获取对象 照例先来段代码轻松下,瞧瞧 block 是怎么获取外部对象的 /********************** capturing objects **************

CComBSTR的生命期

CComBSTR会自动管理字符串的内存空间,在析构时释放空间.由于C++对象在出其作用域时会进行析构.所以有一些情形下,使用CComBSTR容易犯下错误.来看以下代码: BSTR bstr1 = CComBSTR(L"hello"); BSTR bstr2 = CComBSTR(L"world"); TRACE(L"%s, %s\n", bstr1, bstr2); 本来可能预期输出的hello, world而实际输出是world, world