- linux kernel version 4.4.0 (ubuntu 16.04 Server)
- gcc version 5.4.0
- cmake version 3.5.1
项目编译执行./build.sh即可,测试用例进入example/文件夹,make即可生成服务器测试用例
头文件生成至目录/usr/include/mymuduo/,.so库文件生成至目录/usr/lib/。
EventLoop.*、Channel.*、Poller.*、EPollPoller.*等主要用于事件轮询检测,并实现了事件分发处理的底层实现方法。EventLoop负责轮询执行Poller,要进行读、写、错误、关闭等事件时需执行哪些回调函数,均绑定至Channel中,只需从中调用即可,事件发生后进行相应的回调处理即可Thread.*、EventLoopThread.*、EventLoopThreadPool.*等将线程和EventLoop事件轮询绑定在一起,实现真正意义上的one loop per threadTcpServer.*、TcpConnection.*、Acceptor.*、Socket.*等是mainloop对网络连接的响应并轮询分发至各个subloop的实现,其中注册大量回调函数Buffer.*为muduo网络库自行设计的自动扩容的缓冲区,保证数据有序性到达
EventLoop中使用了eventfd来调用wakeup(),让mainloop唤醒subloop的epoll_wait阻塞- 在
EventLoop中注册回调cb至pendingFunctors_,并在doPendingFunctors中通过swap()的方式,快速换出注册的回调,只在swap()时加锁,减少代码临界区长度,提升效率。(若不通过swap()的方式去处理,而是加锁执行pendingFunctors中的回调,然后解锁,会出现什么问题呢?1. 临界区过大,锁降低了服务器响应效率 2. 若执行的回调中执行queueInLoop需要抢占锁时,会发生死锁) Logger可以设置日志等级,调试代码时可以开启DEBUG打印日志;若启动服务器,由于日志会影响服务器性能,可适当关闭DEBUG相关日志输出- 在
Thread中通过C++lambda表达式以及信号量机制保证线程创建时的有序性,只有当线程获取到了其自己的tid后,才算启动线程完毕 TcpConnection继承自enable_shared_from_this,TcpConnection对象可以调用shared_from_this()方法给其内部回调函数,相当于创建了一个带引用计数的shared_ptr,可参考链接 link,同时muduo通过tie()方式解决了TcpConnection对象生命周期先于Channel结束的情况muduo采用Reactor模型和多线程结合的方式,实现了高并发非阻塞网络库
- muduo源码剖析(1)-简介
- muduo源码剖析(2)-muduo编写回射服务器实例
- muduo源码剖析(3)-Timestamp类日志类
- muduo源码剖析(4)-Channel类
- muduo源码剖析(5)-Poller类、EPollPoller类等相关
- muduo源码剖析(6)-EventLoop类介绍1
- muduo源码剖析(7)-EventLoop类介绍2
- muduo源码剖析(8)-Thread类、EventLoopThread类
- muduo源码剖析(9)-EventLoopThreadPool类
- muduo源码剖析(10)-InetAddress类、Socket类
- muduo源码剖析(11)-Acceptor类1
- muduo源码剖析(12)-Acceptor类2
- muduo源码剖析(13)-TcpConnection类、Buffer类
- muduo源码剖析(14)-TcpConnection类、Buffer类2
- muduo源码剖析(15)-TcpConnection类
- muduo源码剖析(16)-TcpServer类
持续更新..
