文章全部内容来源于陈硕大佬的《Linux多线程服务端编程 使用muduo网络库》,此为个人读书笔记
讨论多线程安全,通过对观察者模式的多线程版本的逐步改写,介绍互斥器(mutex)、智能指针作用和用法
智能指针解决了什么问题?:
构造函数只要不泄漏this指针,加锁就可以保证线程安全;
析构则不然,会出现A线程析构对象的时候,B正好在访问该对象,且在B判断该对象是否被释放的时候,A还没来得及释放,这样B就会访问一个混乱的地址内容。(空悬指针)
引入智能指针的概念,其实就是引用技术,中间加了一个中间层proxy,这个proxy包含一个指向真是对象的指针,和一个引用计数器,帮助做垃圾回收。
– weak_ptr:不控制对象生命周期,但能检测对象是否还活着。如果活着这可以提升为有效的shared_ptr。如果死了提升就失败,范围一个空的shared_ptr。
– shared_ptr:强引用,控制对象生命期。
MutexLockGuard lock(mutex_);
lock的析构会晚于返回对象的构造,因此有效地保护了这个共享数据。
weak_ptr解决观察者模式多线程问题:
1.原始观察者模式:
//可观察者类
class Observable{
public:
void register_(Observer* x);
void unregister(Observer* x);
void notifyObservers(){
for(Observer* x : observers_){
x->updata(); //***
}
}
private:
vector<Observer*> observers_;
};
//观察者
class Observer{
public:
Observer(Observable* s){
s->register_(this</