最近又把muduo网络库仔细研究了一遍,收获良多。本文将对muduo中的设计思想以及关键的技术细节进行总结和分析,当然由于篇幅的原因这里更多的是对关键技术的简略提及,具体细节还需要读者自己去查找学习资料。
muduo/base
- Date类
- 日期类的封装,使用Julian(儒略日)可以方便的计算日期差。具体公式和思想见 儒略日的计算
- Exception类
- 异常类的封装,对外提供what()输出错误信息和stacktrace()函数进行栈追踪,使用时需要
throw muduo::Exception("oops");
,外部使用catch (const muduo::Exception& ex)
捕获并使用ex.what()/stackTrace()
获取详细信息。
- 异常类的封装,对外提供what()输出错误信息和stacktrace()函数进行栈追踪,使用时需要
- Atomic类
- 原子性操作比锁的开销小,所以我们可以使用gcc提供的自增自减原子操作;最小的执行单元是汇编语句,不是语言语句。
- CountDownLatch类
- 既可用于所有子线程等待主线程发起“起跑”,也可用于主线程等待子线程初始化完毕才开始工作。其中使用RAII技法封装MutextLockGuard,hodler表示锁属于哪一个线程。
- TimeStamp类
- TimeStamp 继承至
less_than_comparable<>
,使用模板元编程,只需要实现<,可自动实现>,<=,>=。
- TimeStamp 继承至
BlockingQueue
- BlockingQueue和BoundedBlockingQueue分别是无界有界队列,本质上是生产者消费者问题,使用信号量或者条件变量解决。ThreadPool的本质也是生产者消费者问题,任务队列中是任务函数(生产者),线程队列就相当于消费者。基本流程如下图: