当前位置: 首页 > 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.gsyq.cn/news/1457952.html

相关文章:

  • .NET8 DDD实战框架:ABP vNext + SqlSugar 构建带RBAC与BBS模块的后端解决方案
  • 如何高效使用Python通达信数据接口:MOOTDX实战配置指南
  • Flan-T5-TSA-THoR与其他TSA模型对比:优势与局限性分析
  • 终极Windows系统优化神器:WinUtil一键解决所有Windows管理难题
  • 开发者必备:swinv2_tiny_window16_256.ms_in1k特征图提取与可视化终极指南
  • STAR框架:零样本HTTPS网站指纹识别技术解析
  • 从AD9371到ADRV9009:5G射频芯片怎么选?TDD/FDD、带宽、成本全对比
  • 从二进制到版图:手把手教你用Python解析GDSII文件(附完整代码)
  • 构建智能问答系统:基于RAG-Sequence-NQ的企业级应用指南
  • 从Aurora到SATA:手把手教你用Xilinx 7系列FPGA的GTX核搭建高速通信链路
  • 2026年比较好的宁波单向阀/宁波真空泵单向阀口碑好的厂家推荐 - 品牌宣传支持者
  • 终极指南:如何用SilentPatch修复GTA经典三部曲的现代系统兼容性问题
  • 深入ethtool -E:网卡EEPROM修改的Magic Key原理与避坑指南
  • AI写代码总胡乱优化?19条开发家规管住过度发挥
  • 2026年优质的德国带薪就业实习/德国就业政策/德国就业前景/苏州德国带薪就业实习排行榜推荐哪家 - 品牌宣传支持者
  • 炉石传说终极模改插件HsMod:55项功能全面解析与实战指南
  • 2026年知名的江苏电加热炉/电热导热油锅炉主流厂家对比评测 - 品牌宣传支持者
  • 开源报表平台怎么选?深度体验JimuReport积木报表的打印、图表与数据源配置
  • 除了CPU和网卡,DPDK的加密与基带加速器怎么用?一个5G UPF场景下的实战配置解析
  • 2026年6月目前耐用的承插口钢管制造商怎么选择,热浸塑钢管/环氧煤沥青防腐钢管 ,承插口钢管制造企业有哪些 - 品牌推荐师
  • Simulink模型生成DLL时,你八成会踩的这几个坑(附R2017a/b与VS版本匹配避坑指南)
  • 2026年比较好的电加热导热油锅炉/江苏电加热炉多家厂家对比分析 - 行业平台推荐
  • UNet 模型结构从零搭建与实战解析
  • 从SolidWorks到WebGL:一个完整的三维模型‘搬家’流程与踩坑实录
  • 小米AI团队揭秘:MiMo-V2-Flash-Base的27T tokens训练工程实践
  • 别再用Excel做战略推演了!2024智能决策黄金三角模型:因果推理×实时知识图谱×人机协同校验
  • Mermaid实时编辑器架构设计:企业级图表协作与可视化开发平台
  • 终极指南:用Oemer光学音乐识别系统轻松将乐谱照片转为数字音乐
  • TimeMoE-200M未来展望:从2亿参数到更大规模模型的演进路线
  • AI驱动秒杀系统性能飙升300%:揭秘LLM调度引擎+实时库存预测的工业级整合路径