《Muduo C++网络库学习一》以Observer模式谈线程安全问题

本文探讨了在多线程环境下,如何处理对象析构时的竞争条件,重点关注C++中的`shared_ptr`和`weak_ptr`在解决这个问题上的作用。通过分析Observer模式,解释了为何对象的生命周期不能由其自身的mutex保护,并展示了如何利用智能指针来确保线程安全。最后,总结了`shared_ptr`在管理共享资源时的注意事项,以及回调函数的概念在C++编程中的应用。
摘要由CSDN通过智能技术生成

  这是我学习muduo库的第二个阶段,前面一个阶段主要阅读了网络库部分的源码,大致了解网络通信各部分的细节。
  编写线程安全的类不是难事,用同步原语(互斥量,条件变量,信号量等等) 保护内部状态即可。但是对象的生与死不能由对象自身的mutex来保护(△)。如何避免对象析构时存在的竞争条件(race condition)是C++多线程编程面临的基本问题,正确的答案是Boost库中的shared_ptr和weak_ptr(C++11中加入标准库)。
  这篇Blog的写作目的是在看完《Linux多线程服务端编程》第一章之后的总结与体会,免得白看。接下来我将

  1. 结合Observer设计模式谈谈竞争条件(race condition),以及为什么前面(△)这句话这样说。
  2. 简要介绍shared_ptr与weak_ptr,谈谈它们是如何解决这个问题的。
竞争条件

  由于C++要求程序员自己管理对象的生命期,这在多线程就显得尤为困难。特别是当一个对象能被多个线程同时看到时,就会出现所谓的竞争条件(race condition):

  • 在即将析构一个对象时,如何得知此刻是否有别的线程正在执行该对象的成员函数?
  • 如何保证在执行成员函数期间,对象不会在另一个线程被析构?
  • 在调用某个对象的成员函数之前,如何得知这个对象还活着?它的析构函数会不会碰巧执行到一半?

  我们拿Observer模式来看看race condition。所谓Observer模式,也叫观察者模式,是一种一对多的设计模型,当Observable(被观察者)变化时,会主动更新与其关联的Observer(观察者),代码如下:

//观察者
class Observer {
public:
	~Observer();
	void update();
};
//观察目标
class Obervable {
public:
	void notifyObserv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值