/cgmuduo

muduo库c++11版

Primary LanguageC++

cgmuduo-muduo库c++11版

muduo是一个基于非阻塞IO和事件驱动的C++网络库,采用Reactor模式和one loop per thread + thread pool线程模型。

jiagou

使用

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包含ChannelPollerEventLoop负责轮询访问Poller,得到激活Channel列表,使Channel自己根据自身情况调用相应回调。

Thread.*EventLoopThread.*EventLoopThreadPool.*将线程与EventLoop绑定在一起,实现one loop per thread + thread pool线程模型。

TcpServer.*Acceptor.*TcpConnection.*为上层Reactor模式的实现。TcpServer面向用户,可由用户自定义回调方法以及启动服务器。Acceptor也看做分发器,当有新连接到来时,用来将连接转发给子线程处理。TcpConnection在子线程处理被分来的连接的具体事件。

执行流程

liucheng

  1. 用户创建TcpServer对象调用start()开启服务器,启动线程池,启动一个baseLoop(主线程),由runInLoop()处理Acceptor(Reactor)的listen()方法,进行监听操作;
  2. 一旦有客户端请求连接,Accetor调用TcpServer设置的newConnectionCallback_,将请求分发给subLoop(子线程),即从线程池中取出,然后将连接丢给子线程,由TcpConnection处理,此后该连接的所有操作都由该子线程独自处理,与其他线程无关。
  3. TcpConnection将读,写,关闭,错误操作与回调填充至绑定的Channel,然后调用runInLoop()queueInLoop()由底层事件循环处理。
  4. 底层事件循环中,主线程称为baseLoop,只执行监听操作与用户回调。而子线程具体执行操作由Channel具体返回的事件所执行。由图所示,蓝色部分由三类组成,EventLoopChannelPoller。每个EventLoop分别与各自的线程绑定,同时将PollerChannel连接起来,调用loop()方法将Channel的结果送入Poller执行,将Poller返回的结果各自送入Channel执行。

学习记录

muduo剖析(1)
muduo剖析(2)

fix bugs

  1. 没有设置ConnectionCallback和MessageCallback,当连接时,报错bad_function_call

设置defaultConnectionCallback和defaultMessageCallback,并在构建TcpServer时初始化

  1. Epollpoller.cc:103处发生段错误,似乎是static_cast<Channel*>出问题

将g++版本升级到9以上

  1. 自定义回调函数,接收消息时报段错误

将g++版本升级到9以上

如有问题,欢迎指正,欢迎star