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

1.当析构函数遇到多线程

①在即将析构一个对象时,别的线程是否正在执行该对象的成员函数?
②如何保证在执行成员函数期间,对象不在另一个线程被析构?
③在调用某个成员函数之前,如何确保对象还活着?析构函数会不会执行到一半?

1.1线程安全类

①多个线程同时访问,表现出正确的行为

②无论操作系统如何调度这些线程,无论这些线程执行顺序如何交织

③调用端代码无需额外的同步

锁一般是栈上对象,只需要临界区加锁即可,解锁正好等于其作用域

对象构造要线程安全,唯一要求在构造期间不要泄露指针(构造函数执行期间对象还没有完成初始化,如果泄露给其它对象,显而易见可能会更改)

1.2作为数据成员的MutexLock只能同步保护class其它数据成员的读写,不能保证安全析构,因为MutexLock成员生命期最多与对象一样长,而析构可能发生在对象释放之后

1.3判断一个指针是不是合法指针没有高效的办法,这是c/c++指针问题的根源

对象的关系主要有三种:composition、aggregation、association

1.composition:对象x的生命期由其owner控制,x是owner的直接数据成员,或者是owner持有的容器元素

2.association 、aggregation:a持有b的指针或引用,但是b的生命期不由a控制

c++可能出现的内存问题:

①缓冲区溢出

②空悬指针/野指针

③重复释放

④内存泄漏

⑤不配的new[]/delete

⑥内存碎片

用流水线、生产者消费者,任务队列这些有规律的机制,最低限度共享数据,是多线程编程最好的建议

1.原始指针暴露给多个线程会造成race condition

2.统一使用shared_ptr/scoped_ptr管理生命期,在多线程中尤其重要

3.shared_ptr是值语意,当心意外延迟对象生命期

4.weak_ptr可以用作若回调、对象池

 

posted @ 2021-03-07 16:44  zzlj  阅读(120)  评论(0)    收藏  举报