zoukankan      html  css  js  c++  java
  • 线程安全的对象生命期管理

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

    解决对象构造的线程安全

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

    单例模式

    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

  • 相关阅读:
    【转】VB 技巧一
    VB中的trim()函数
    转:vb实现老板键功能
    VB为自己的程序设定消息(可接收处理)
    RegisterHotKey的具体使用方法
    GetPrivateProfileString
    在VB语言中,DOEVENTS的具体的用法和含义
    VB中的ADO数据对象编程
    jquery操作select下拉列表框
    jQuery对Select的操作集合
  • 原文地址:https://www.cnblogs.com/joeylee97/p/8970992.html
Copyright © 2011-2022 走看看