这是我学习muduo库的第二个阶段,前面一个阶段主要阅读了网络库部分的源码,大致了解网络通信各部分的细节。
编写线程安全的类不是难事,用同步原语(互斥量,条件变量,信号量等等) 保护内部状态即可。但是对象的生与死不能由对象自身的mutex来保护(△)。如何避免对象析构时存在的竞争条件(race condition)是C++多线程编程面临的基本问题,正确的答案是Boost库中的shared_ptr和weak_ptr(C++11中加入标准库)。
这篇Blog的写作目的是在看完《Linux多线程服务端编程》第一章之后的总结与体会,免得白看。接下来我将
- 结合Observer设计模式谈谈竞争条件(race condition),以及为什么前面(△)这句话这样说。
- 简要介绍shared_ptr与weak_ptr,谈谈它们是如何解决这个问题的。
竞争条件
由于C++要求程序员自己管理对象的生命期,这在多线程就显得尤为困难。特别是当一个对象能被多个线程同时看到时,就会出现所谓的竞争条件(race condition):
- 在即将析构一个对象时,如何得知此刻是否有别的线程正在执行该对象的成员函数?
- 如何保证在执行成员函数期间,对象不会在另一个线程被析构?
- 在调用某个对象的成员函数之前,如何得知这个对象还活着?它的析构函数会不会碰巧执行到一半?
我们拿Observer模式来看看race condition。所谓Observer模式,也叫观察者模式,是一种一对多的设计模型,当Observable(被观察者)变化时,会主动更新与其关联的Observer(观察者),代码如下:
//观察者
class Observer {
public:
~Observer();
void update();
};
//观察目标
class Obervable {
public:
void notifyObserv