当前位置: 首页 > news >正文

ZLToolKit 源码分析(五):EventPoller 事件轮询器实现

EventPoller 是 ZLToolKit 最核心的组件,将 epoll/kqueue/select 统一抽象为 Reactor 模型。本文从跨平台封装到 epoll 系统调用,逐层拆解其实现。

1. 跨平台 IO 多路复用抽象

1.1 编译期平台选择

// EventPoller.cpp#ifdefined(__linux__)&&!defined(ENABLE_EPOLL_FALLBACK)#defineHAS_EPOLL1#elifdefined(__APPLE__)||defined(__FreeBSD__)||defined(__OpenBSD__)#defineHAS_KQUEUE1#else#defineHAS_SELECT1#endif
平台实现系统调用
Linuxepollepoll_create1 / epoll_ctl / epoll_wait
macOS/BSDkqueuekqueue / kevent
Windows/othersselectselect

1.2 接口统一

classEventPoller:publicThreadPool{public:// 添加 fd 事件监听intaddEvent(intfd,intevent,PollEventCB&&cb);// 删除 fd 事件监听booldelEvent(intfd,PollCompleteCB&&cb=nullptr);// 修改 fd 事件intmodifyEvent(intfd,intevent);// 异步任务Task::Ptrasync(TaskInCB&&task,boolmay_sync=true)override;// 延时任务DelayTask::PtrdoDelayTask(uint64_tdelay_ms,function<uint64_t()>&&task)override;// 事件循环voidrunLoop(boolis_try=false);};

上层代码只需调用addEvent/delEvent/modifyEvent,不需关心底层是 epoll 还是 select。

2. EventPoller 构造

EventPoller::EventPoller(conststring&name,Priority priority,boolbind_cpu){// 1. 创建 epoll 实例#ifdefined(HAS_EPOLL)_epoll_fd=epoll_create1(EPOLL_CLOEXEC);if(_epoll_fd<0){throwruntime_error("epoll_create1 failed");}#elifdefined(HAS_KQUEUE)_epoll_fd=kqueue();// ...#else// select 模式无专用 fd#endif// 2. 创建通知管道if(pipe(_pipe_fd)!=0){throwruntime_error("pipe failed");}// 3. 将管道读端注册到 epolladdEvent(_pipe_fd[0],EPOLLIN,[this](intevents){onPipeEvent();});// 4. 启动工作线程// ThreadPool 基类中 _threads[i] = new thread(runLoop)// 5. CPU 亲和性if(bind_cpu){setCPUAffinity(thread_index);}}

系统调用链

epoll_create1(EPOLL_CLOEXEC) → _epoll_fd pipe2(_pipe_fd, O_CLOEXEC) → 通知管道 epoll_ctl(_epoll_fd, EPOLL_CTL_ADD, _pipe_fd[0], EPOLLIN)

3. addEvent / delEvent / modifyEvent

http://www.jsqmd.com/news/946452/

相关文章:

  • 2026年口碑好的大件搬家服务/仓库搬家服务/写字楼搬家服务/厂房搬家服务用户好评公司 - 行业平台推荐
  • 从命令行小白到CLI高手:用Python Click三大框架打造你的专属工具集
  • 面向对象 vs 函数式背后的思维差异
  • 终极Windows系统优化神器:WinUtil一键解决所有Windows管理难题
  • OpenCPN 航海导航软件:从零开始的完整安装与配置终极指南
  • 2026年正规的德国双元制IHK认证/德国双元制免学费/苏州德国双元制正规招生行业推荐哪家 - 品牌宣传支持者
  • 广告算法工程师绝不会告诉你的秘密:如何用轻量级LoRA微调替代全模型重训,降低92%推理延迟(实测TPS 23,800+)
  • 从AD9371到ADRV9009:5G射频芯片怎么选?TDD/FDD、带宽、成本全对比
  • MongoDB数据迁移实战:用Compass一键导入导出JSON/CSV文件(含数据清洗技巧)
  • 从硬件选型到SLA设计:产品经理和硬件工程师必须搞懂的MTBF计算与避坑指南
  • S32K144 + FreeRTOS一体化开发模板:CAN/UART/ADC驱动已就绪,开箱即编译运行
  • 从AD9371到ADRV9009:5G射频芯片怎么选?TDD/FDD、带宽、成本全解析
  • 从二进制到版图:手把手教你用Python解析GDSII文件(附完整代码)
  • 从课堂笔记到实战:手把手教你用SOI脊型波导设计低损耗光芯片(附Taper优化技巧)
  • AI辅助开发新体验:描述你的创意,快马自动生成动态3D魔鬼面具
  • 构建智能问答系统:基于RAG-Sequence-NQ的企业级应用指南
  • 高效直播调试:OBS Studio日志系统深度优化实战指南
  • 2026年优质的德国就业紧缺职业/苏州德国就业中介机构/德国就业居留许可/德国就业政策哪家成功率高 - 行业平台推荐
  • 告别黑屏!一招解决ffplay播放H265编码的HTTP-FLV直播流失败问题
  • 别再乱点陌生链接了!带你揭秘网页脚本如何悄悄操作你的电脑文件(VBScript实战解析)
  • 从Aurora到SATA:手把手教你用Xilinx 7系列FPGA的GTX核搭建高速通信链路
  • Gemma 4-31B函数调用指南:构建智能代理的终极教程
  • 2026年比较好的宁波单向阀/宁波真空泵单向阀口碑好的厂家推荐 - 品牌宣传支持者
  • Transformer:一篇论文如何改变 AI 世界
  • 从‘开关电路’到‘程序条件判断’:德摩根律与蕴涵等值式的日常应用避坑指南
  • 2026年6月供水设备公司哪家靠谱,一体化泵站/智能一体化消防泵/供水控制柜/不锈钢供水设备,供水设备企业哪家强 - 品牌推荐师
  • 别再让el-tabs拖慢你的Vue项目了!手把手教你实现el-table按需加载(附完整代码)
  • 终极指南:如何用SilentPatch修复GTA经典三部曲的现代系统兼容性问题
  • 深入ethtool -E:网卡EEPROM修改的Magic Key原理与避坑指南
  • AI写代码总胡乱优化?19条开发家规管住过度发挥