第1章 线程安全的对象生命期管理
编写线程安全的类不是难事,用同步原语(synchronization primitives)保护内部状态即可。但是对象的生与死不能由对象自身拥有的mutex(互斥器)来保护。如何避免对象析构时可能存在的race condition(竞态条件)是C++(www.cppentry.com) 多线程编程(www.cppentry.com)面临的基本问题,可以借助Boost 库中的shared_ptr 和weak_ptr 1 完美解决。这也是实现线程安全的Observer 模式的必备技术。
本章源自2009 年12 月我在上海祝成科技举办的C++(www.cppentry.com) 技术大会的一场演讲《当析构函数遇到多线程》,读者应具有C++(www.cppentry.com) 多线程编程(www.cppentry.com)经验,熟悉互斥器、竞态条件等概念,了解智能指针,知道Observer 设计模式。
1.1 当析构函数遇到多线程
与其他面向对象语言不同,C++(www.cppentry.com) 要求程序员自己管理对象的生命期,这在多线程环境下显得尤为困难。当一个对象能被多个线程同时看到时,那么对象的销毁时机就会变得模糊不清,可能出现多种竞态条件(race condition):
在即将析构一个对象时,从何而知此刻是否有别的线程正在执行该对象的成员函数?
如何保证在执行成员函数期间,对象不会在另一个线程被析构?
在调用某个对象的成员函数之前,如何得知这个对象还活着?它的析构函数会不会碰巧执行到一半?
解决这些race condition 是C++(www.cppentry.com) 多线程编程(www.cppentry.com)面临的基本问题。本文试图以shared_ptr 一劳永逸地解决这些问题,减轻C++(www.cppentry.com) 多线程编程(www.cppentry.com)的精神负担。