• C++11重写muduo网络库3—Channel库(channel模块待补充完善)


    TcpServer相当于是muduo库提供给外部编写服务器程序的入口的一个类,相当于一个大箱子,
    把muduo库有关服务器的编程相关的东西,包括反应堆,事件分发器,事件回调都打包一块了。

    eventloop事件循环相当于是一个epoll,管理

    pooller相当于是epoll抽象的概念,用poller当做1个基类,在派生类中实现了poll和epoll

    epoll里面还得需要监听socket

    revents是具体的发生的事件

    channel我们理解成通道,相当于就是fd和它所绑定的感兴趣的event,如EPOLLIN、EPOLLOUT 还绑定了epoller返回时fd上发生的事件(绑定)。

    最后 eventloop包含channel,eventloop是事件循环,相当于事件分发器一样,包含了epoll,也就是poller,另外就是epoll感兴趣的fd,以及它对应的事件和最终发生的事件被muduo库封装成channel

    这些事件最终要向poller注册,发生的事件由poller给channel通知,channel得到相应fd的事件通知 调用预置的回调操作

    一个线程有一个eventloop,一个eventloop有一个poller,一个poller可以监听多个channel,每个channel属于1个eventloop,1个eventloop有很多channel,这就是多路。

    channel包含了fd和fd感兴趣的事件。

    TcpServer.h

    EventLoop.h

    时间循环类,主要包含了两个大模块,一个是channel,一个是epolller

    Channel封装了socket和感兴趣的event(EPOLLIN、EPOLLOUT可读或者可写)

    
    //
    //几个具体的函数
    
    
    //构造函数
    Channel::Channel(EventLoop *loop, int fd)
    
    //tie方法   弱智能指针指向
    void Channel::tie(const std::shared_ptr<void> &obj)
    
    //通过channel所属的EventLoop,调用poller的相应方法,注册fd的events事件
    //本类里面有个EventLoop的对象指针loop_,调用它的方法updateChannel,将this当参数传递过去
    void Channel::update() {loop_->updateChannel(this);}
    
    //同update,调用其方法,传递过去
    void Channel::remove(){loop_->removeChannel(this);}
    
    //fd得到poller通知后处理事件
    //  将弱智能指针提升为强智能指针,这里的lock不是加锁而是提升
    //然后调用本类中的方法
     //tie
    void Channel::handleEvent(Timestamp receiveTime)
    
    
    // 根据poller通知的channel发生的具体事件, 由channel负责调用具体的回调操作,读写错误关闭四个事件
    //比如如果是写事件执行写回调函数
    void handleEvent(Timestamp receiveTime)
    

    此外还有其他的一些方法

  • 相关阅读:
    面试官:做过性能优化?我:任务切片!
    【LeetCode】768. 最多能完成排序的块II
    云原生中间件RocketMQ-消费者核心参数、消费模式之集群模式
    redis缓存问题
    stata做莫兰指数,结果不显示是怎么回事,求解答
    【Python】
    30个必知必会React面试题汇总,附答案!
    BasicAuth认证实现
    .net 支付宝 应用网页验签
    macOS配置java环境变量
  • 原文地址:https://blog.csdn.net/baidu_41553551/article/details/126934235