线程安全的对象生命期管理
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可以用作若回调、对象池

浙公网安备 33010602011771号