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

  • 相关阅读:
    过滤非GBK字符
    打印整数数字
    std::string 方法列表
    设计模式——单例模式(Singleton )
    编程之美二进制一的个数
    Jsoncpp试用指南
    GCC下宏扩展后的++i
    关于字节对齐的sizeof的讨论
    Notepad++ 更改和定制主题
    求子数组的最大和
  • 原文地址:https://www.cnblogs.com/joeylee97/p/8970992.html
Copyright © 2011-2022 走看看