Bootstrap

c语言多线程造成的崩溃,C++多线程析构函数引起程序崩溃解析.pdf

C多线程析构函数引起程序崩溃解析

当析构函数遇到多线程

── C++ 中线程安全的对象回调

陈硕 (giantchen_AT_gmail)

B/Solstice

摘要

编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由

对象自身拥有的互斥器来保护。如何保证即将析构对象 x 的时候,不会有另一个线程正在

调用 x 的成员函数?或者说,如何保证在执行 x 的成员函数期间,对象 x 不会在另一个

线程被析构?如何避免这种竞态条件是 C++ 多线程编程面临的基本问题,可以借助 boost

的 shared_ptr 和 weak_ptr 完美解决。这也是实现线程安全的 Observer 模式的必备技术。

本文源自我在 2009 年 12 月上海 C++ 技术大会的一场演讲《当析构函数遇到多线

程》,内容略有增删。原始 PPT 可从 /source/1982430 下载。

本文读者应具有 C++ 多线程编程经验,熟悉互斥器、竞态条件等概念,了解智能指针,

知道 Observer 设计模式。

1

当析构函数遇到多线程 by 陈硕 B/Solstice

目录

1 多线程下的对象生命期管理2

线程安全的定义3

Mutex 与 MutexLock3

一个线程安全的 Counter 示例3

2 对象的创建很简单4

3 销毁太难5

Mutex 不是办法5

作为数据成员的 Mutex6

4 线程安全的 Observer 有多

;