muduo是一个基于非阻塞IO和事件驱动的C++网络库,采用Reactor模式和one loop per thread + thread pool线程模型。
linux g++ version(9.+) c++17(因使用std::any,所以升级为17)
linux下,项目编译执行./autobuild.sh
,测试用例进入example/
文件夹,make生成测试程序
核心模块 |
---|
Socket |
Buffer |
Channel |
Poller与Epoller |
EventLoop与EventLoopThread |
EventLoopThreadPool |
Acceptor |
TcpConnection |
TcpServer |
Channel.*
,Poller.*
,EventLoop.*
三类为一体,在底层负责事件循环。EventLoop包含Channel,Poller,EventLoop负责轮询访问Poller,得到激活Channel列表,使Channel自己根据自身情况调用相应回调。
Thread.*
,EventLoopThread.*
,EventLoopThreadPool.*
将线程与EventLoop绑定在一起,实现one loop per thread + thread pool线程模型。
TcpServer.*
,Acceptor.*
,TcpConnection.*
为上层Reactor模式的实现。TcpServer面向用户,可由用户自定义回调方法以及启动服务器。Acceptor也看做分发器,当有新连接到来时,用来将连接转发给子线程处理。TcpConnection在子线程处理被分来的连接的具体事件。
- 用户创建TcpServer对象调用
start()
开启服务器,启动线程池,启动一个baseLoop(主线程),由runInLoop()
处理Acceptor(Reactor)的listen()
方法,进行监听操作; - 一旦有客户端请求连接,Accetor调用TcpServer设置的newConnectionCallback_,将请求分发给subLoop(子线程),即从线程池中取出,然后将连接丢给子线程,由TcpConnection处理,此后该连接的所有操作都由该子线程独自处理,与其他线程无关。
- TcpConnection将读,写,关闭,错误操作与回调填充至绑定的Channel,然后调用
runInLoop()
和queueInLoop()
由底层事件循环处理。 - 底层事件循环中,主线程称为baseLoop,只执行监听操作与用户回调。而子线程具体执行操作由Channel具体返回的事件所执行。由图所示,蓝色部分由三类组成,EventLoop,Channel和Poller。每个EventLoop分别与各自的线程绑定,同时将Poller和Channel连接起来,调用loop()方法将Channel的结果送入Poller执行,将Poller返回的结果各自送入Channel执行。
- 没有设置ConnectionCallback和MessageCallback,当连接时,报错bad_function_call
设置defaultConnectionCallback和defaultMessageCallback,并在构建TcpServer时初始化
- Epollpoller.cc:103处发生段错误,似乎是
static_cast<Channel*>
出问题
将g++版本升级到9以上
- 自定义回调函数,接收消息时报段错误
将g++版本升级到9以上