线程安全的对象生命期管理
解决对象构造的线程安全
- 当我们需要动态分配对象时( 懒加载 ), 如果在多个线程中运行这一部分代码,可能出现多次初始化的问题。
单例模式
c++ 11 之后static 变量的初始化是线程安全的。可以利用静态变量来实现单例模式,解决重复初始化的问题。
std::call_once
个人感觉不够优美,要传递一个flag 来标识初始化情况
线程访问未初始化的资源
比如在Thread类中,std::thread被构造之后立即开始执行线程中函数,然而函数中访问的资源可能还没有被初始化。
解决方案:
- 成员初始化列表控制构造顺序
- 手动控制线程函数的运行
- 不要泄露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