• 多路分发器:IO复用的抽象Poller


    多路分发器:IO复用的抽象Poller

    来看Poller的成员函数定义:
    在这里插入图片描述
    可以看到Poller有几个纯虚函数接口,是一个抽象类。为什么要设计成抽象类呢?
    muduo提供了两个IO复用能力:poll和epoll,但并没有指定要用epoll,Poller的抽象就可以很容易的扩展不同的IO复用能力,通过Poller提供的newDefaultPoller接口,就可以给用户构造一个默认的Poller。
    在这里插入图片描述
    muduo通过环境变量来控制用poll还是epoll,默认使用epoll。
    需要注意,newDefaultPoller尽量不要在Poller中定义的 。
    因为在继承结构中,Poller是基类,PollPoller和EPollPoller是派生类,只能是派生类引用基类,基类不能引用派生类。 虽然语法上没什么错误,但这样不合理。
    重写Poller.h:

    #pragma once
    
    #include "noncopyable.h"
    #include "Timestamp.h"
    
    #include 
    #include 
    
    class Channel;
    class EventLoop;
    
    //muduo库中多路事件分发器的核心IO复用模块
    class Poller : noncopyable
    {
    public:
        using ChannelList = std::vector<Channel*>;
    
        Poller(EventLoop* loop);
    
        virtual ~Poller() = default;
        //给所用IO复用保留统一的接口
        virtual Timestamp poll(int timeoutMs, ChannelList* activeChannel) = 0;
        virtual void updateChannel(Channel* channel) = 0;
        virtual void removeChannel(Channel* channel) = 0;
        bool hasChannel(Channel* channel) const;
    
        //EventLoop可以通过该接口获取默认的IO复用的具体实现
        static Poller* newDefaultPoller(EventLoop* loop);
    protected:
        //map的key表示sockfd value表示sockefd所属的channel通道类型
        using ChannelMap = std::unordered_map<int,Channel*>;
        ChannelMap channels_;
    
    private:
        EventLoop *ownerLoop_;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    重写Poller.cc:

    #include "Poller.h"
    #include "Channel.h"
    
    Poller::Poller(EventLoop* loop)
        :ownerLoop_(loop)
    {}
    
    bool Poller::hasChannel(Channel* channel) const
    {
        auto it = channels_.find(channel->fd());
        return it != channels_.end() && it->second == channel;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    集成 NVDC 电源路径管理的1-4节电池升降压充电IC解决方案
    C语言 switch分支结构
    Nginx+Tomcat
    【深度学习】分类损失函数解析
    C# Winform程序界面优化实例
    Ranger (二) ---------- Ranger 安装
    【不限框架】超好用的3d开源图片预览插件推荐
    WuThreat身份安全云-TVD每日漏洞情报-2023-09-20
    C++模板
    电场与磁场中的物理量
  • 原文地址:https://blog.csdn.net/weixin_43973403/article/details/126165653