- 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 thread
TcpServer.*
、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类
持续更新..