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

  • 相关阅读:
    python基本数据类型操作
    ansible基本命令及剧本
    ansible模块及语法
    ansible主机组配置及秘钥分发
    ansible简介安装配置
    K8S使用---故障处理
    python脚本案例---备份单个目录
    telnet-server故障
    zabbix故障处理
    网站部署---LAMP环境部署PHP网站
  • 原文地址:https://www.cnblogs.com/joeylee97/p/8970992.html
Copyright © 2011-2022 走看看