尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
muduo网络库(六):Poller类与IO复用
muduo网络库六Poller类与IO复用muduo网络库六Poller类与IO复用概述EpollPoller 子类核心方法Channel 与 epoll_event 的绑定机制newDefaultPoller 为什么单独放在一个文件中精髓总结muduo网络库六Poller类与IO复用概述Poller是 muduo 网络库中IO 复用机制的抽象层它封装了不同的多路复用技术如 epoll、poll、select为上层提供统一的接口。EpollPoller是其基于 Linux epoll 实现的具体子类。在Poller类中只有两个核心成员一个channels_Map存储当前所有的 Channel一个loop_指针标识当前所属的 EventLoop其余都是纯虚函数因为每种具体的多路复用技术epoll、poll 等都有各自的实现逻辑。EpollPoller 子类EpollPoller是对 epoll 的封装因此有两个关键成员epollFd_epoll 的监听文件描述符作为监听仓库events_vectorepoll_event保存 epoll_wait 返回的事件容器核心方法1. updateChannel()先把新 Channel 加入到channels_Map 中删除则修改 index然后根据 Channel 的状态调用 epoll 的update函数即epoll_ctl。状态转换逻辑如下kNew未注册→ 加入 channels Map → 变为kAddedkAdded已注册→ 如果无感兴趣事件isNoneEvent()→EPOLL_CTL_DEL→ 变为kDeletedkAdded→ 如果有事件变更 →EPOLL_CTL_MODkDeleted已删除→ 重新添加 →EPOLL_CTL_ADD→ 变为kAdded通过 Channel 的index_成员来标识它在 epoll 中的状态从而决定是添加、修改还是删除。2. removeChannel()从channels_Map 中删除指定的 Channel同时从 epoll 中删除。3. poll()调用epoll_wait()函数监听所有已注册的 fd。要监听的 fd 已经通过updateChannel加入到epollFd_中了。返回结果存储在events_中必要时会动态扩容。4. fillActiveChannels()遍历events_由于epoll_event结构中的data.fd和data.ptr指向的 Channel 都是绑定的直接将data.ptr转换为Channel*加入到activeChannels中即可。后续在EventLoop::loop()中遍历activeChannels调用Channel::handleEvent()处理事件。注意Poller 只是监听 fd当监听到可读事件后上层调用accept()才真正建立连接。Poller 相当于只负责监听当前线程的 fd构建 channels是 EventLoop 的一部分。Channel 与 epoll_event 的绑定机制Poller结合EpollPoller将 epoll 机制封装每个 EventLoop 只有一个 Poller用于监听所有 Channel。核心在于利用epoll_event.data.ptr将 Channel 和 epoll 监听的事件绑定起来。注册时绑定structepoll_eventevent;event.eventschannel-events();event.data.ptrchannel;// 将 Channel 指针存入 epoll_event::epoll_ctl(epollFd_,operation,fd,event);事件触发时取回Channel*channelstatic_castChannel*(events_[i].data.ptr);这样就将事件 Channel 与 IO 多路复用机制联系了起来而它们都在 EventLoop 类中协作。newDefaultPoller 为什么单独放在一个文件中DefaultPoller::newDefaultPoller()是一个工厂方法用于动态选择 IO 复用实现根据环境变量MUDUO_USE_POLL决定使用哪种 IO 复用方式解耦架构EventLoop 不需要直接依赖具体的 epoll 或 poll 实现通过工厂方法获取。本项目中只实现了 epoll所以默认返回EpollPoller这体现了依赖倒置原则抽象不依赖于具体具体依赖于抽象。单独放在一个文件中的关键原因是避免循环依赖如果把newDefaultPoller放在Poller.cc中实现Poller.cc需要包含具体子类的头文件#include EPollPoller.h而EPollPoller.h又需要继承Poller包含#include Poller.h这就形成了循环依赖导致编译失败。Poller.h (抽象基类) ↑ 继承 EPollPoller.h DefaultPoller.cc (工厂方法) → 包含 Poller.h 和 EPollPoller.h → 负责创建具体实例将工厂方法单独放在DefaultPoller.cc中打破了这种循环依赖让架构更加清晰。精髓总结Poller 类的设计体现了几个关键思想多态抽象Poller定义统一接口EpollPoller提供具体实现上层代码不感知底层细节epoll_event.data.ptr 绑定巧妙利用 epoll 的data.ptr字段将事件和 Channel 直接关联零开销取回工厂模式解耦newDefaultPoller单独编译避免循环依赖遵循依赖倒置原则每个 EventLoop 一个 Poller符合 One Loop Per Thread 模型线程内无需加锁
RELATED

相关推荐

什么,新用户打开千问有惊喜?

什么,新用户打开千问有惊喜?

就是这个APP,家人们,必须要接住这个福利,这是2026年千问App的最新7月活动!也是最新给大家的福利,以下是具体的领取方法,亲测可用呦!第一步骤:下载千问App软件第二步骤:输…

📅 2026/8/23 9:19:46
FlashAttention 深度解析

FlashAttention 深度解析

FlashAttention 深度解析 FlashAttention 是大语言模型(LLM)发展史上的里程碑式技术。它通过算法与底层硬件(GPU)的深度协同,从根本上解决了标准 Transformer 自注意力机制的 O(N2)O(N^2)O(N2) 复杂度瓶颈,…

📅 2026/9/10 5:38:51
AI与电力的百年镜像:AI当前的历史节点

AI与电力的百年镜像:AI当前的历史节点

电力(二次工业革命电气化体系)与AI大模型(生成式通用人工智能)是人类工业文明史上两代核心通用目的技术(General Purpose Technology, GPT),具备跨行业渗透、技术持续迭代、重构生产要素、催生全新产业生态的核心特征。 底层物理与生产力本质 能量转化 vs 智力转化 核…

📅 2026/9/10 5:35:59
MORE NEWS

更多资讯

📰

全球十大净水器排名实战项目性能优化避坑指南

全球十大净水器排名实战项目性能优化避坑指南 配置环境就卡半天,代码跑不动,内存直接爆掉。 别急着怪电脑配置低,大概率是你没搞懂底层数据流转的阻塞点。 我在做 实战项目 时,常拿 全球十大净水器排名…

📰

页游乐园性能瓶颈拆解:3步保姆级教程搞定卡顿

页游乐园性能瓶颈拆解:3步保姆级教程搞定卡顿 版本升级后 API 全变了,你的页游乐园项目还在用旧代码硬扛?别慌。这份保姆级教程不玩虚的,直接带你从底层原理到落地代码,把“页游乐园”这种高交互、多组件场景下的性能瓶颈一次性掐灭。…

📰

别被八个雅鹿源码解析劝退:3步搞定晋升与学时

别被八个雅鹿源码解析劝退:3步搞定晋升与学时 官方文档堆成山,翻两页就头晕,这是不是你的日常?别慌,咱们不整虚的。 今天拆解 八个雅鹿 ,不讲晦涩理论,只说人话。 你刚入行时,是不是也被那些长篇大论的规范劝退过?…

📰

周字怎么写好看速查手册:3种渲染方案性能实测

周字怎么写好看速查手册:3种渲染方案性能实测 官方文档翻了三遍还是觉得太厚,抓不住重点?做前端或者全栈的朋友都知道,处理“周字怎么写好看”这类涉及字体渲染、字形优化的需求时,往往要在多种技术方案里纠结半天。今天这篇速查手册,不聊虚的,直接上…

📰

3步搞定yy杨图解,高频面试题实战项目从零搭建

3步搞定yy杨图解,高频面试题实战项目从零搭建 官方文档往往冗长枯燥,读完还是抓不住核心逻辑。很多高频面试题看似简单,实则考察对底层原理的理解。本文将结合yy杨图解原理,通过一个从零搭建的实战项目,带你把抽象概念变成可运行的代码。…

📰

台历怎么做性能慢?一文搞懂3个核心优化点

台历怎么做性能慢?一文搞懂3个核心优化点 报错一堆看不懂 StackTrace?别慌,这种堆栈信息看着吓人,其实就是程序在喊疼。很多开发者一看到红色异常就头大,觉得是玄学,其实都是性能瓶颈在作祟。今天我们就拿“台历怎么做”这个典型业务场景,…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬