仿muduo实现高并发服务器——事件就绪管理Channel.hpp

目录

    • 摘要
    • 注释
      • [3.1 回顾](#3.1 回顾)
      • [3.2 新知识](#3.2 新知识)
      • [3.3 AI辅助](#3.3 AI辅助)
    • 正文
      • [4.1 监控位维护](#4.1 监控位维护)
      • [4.2 分发与析构](#4.2 分发与析构)
    • 总结
    • 常见问题
    • 标签

摘要

Channel.hpp 是单个 fd 的事件通道封装:_events 存监控位、_revents 存触发位,另有五个 std::function<void()> 回调,由 HandleEvent() 按位分发。价值在于把位掩码与回调绑在同一个 fd 上。

代码仓库:https://gitee.com/btshadow/Ubuntu_learning/blob/master/October/10-18/muduo/src/server.hpp

注释

3.1 回顾

①EPOLLIN/EPOLLOUT 是单比特:|= 添加、&= ~ 解除、& 判断,分别落在 Enable*、Rem*、ReadAble/WriteAble。

②std::function 对象的调用方式同普通函数。

③函数指针如何设置、是否都加 &,见 3.2 表首行。

④**_events 是对 fd 的监控,_revents 是 fd 事件的触发情况**,两者不可混用。

⑤EPOLLPRI 是该 fd 上有紧急数据或带外数据可读,重点📌,故并入 HandleEvent() 的读分支。

3.2 新知识

EPOLLRDHUP 是对端写端关闭,故要读完、走 read 回调;EPOLLHUP 是连接挂起、双方通信均不可用,走 close 回调。这正对应 HandleEvent() 中 RDHUP 与 EPOLLIN、EPOLLPRI 同组触发 _read_cb,HUP 单独触发 _close_cb。

函数包装器传指针还是对象:

传入内容 写法 说明
自由函数 wrap(handler) 或 wrap(&handler) 等价,都退化为函数指针
左值 lambda/函数对象 wrap(lam) 零拷贝,const F& 绑定
临时 lambda wrap(\[\]{...}) 生命周期延长到调用结束
move-only 可调用对象 wrap(std::move(obj)) const F& 也能绑右值,但若包装器要保存则需 F&& 版本
成员函数 wrap(\&{ obj.method(); }) 用 lambda 包一层最清晰

本文件 Set 系列形参全为 const callback&,三种可调用物都落到这一签名。

包装器对象默认初始化为空值:构造初始化列表未列五个回调成员,故默认为空,各 Set 靠 assert(x != nullptr) 防空。

3.3 AI辅助

AI 辅助了重复字段------各 Set 前的空值判定,仿照 SetReadCB 写完其余四个。SetReadCB 首行注「防相同赋值(难):std::function 无 ==,无法可靠比较,跳过」,解释了只防空、不比同值的原因。

正文

4.1 监控位维护

EnableRead/EnableWrite 先用 ReadAble/WriteAble(即 EPOLLIN & _events、EPOLLOUT & _events)判是否已监控,重复则 WRN_LOG 返回,否则 |=;RemRead/RemWrite 反向判空后 &= ~;RemAll 以 _events == 0 判重再清零。

4.2 分发与析构

HandleEvent() 四段 if:EPOLLIN、EPOLLRDHUP、EPOLLPRI 任一命中调 _read_cb,EPOLLOUT、EPOLLERR、EPOLLHUP 各调对应回调,末尾 _event_cb() 无条件调用,代码注「任意事件(待调整)」。析构把 _fd、_events、_revents 置 -1;Remove() 留空待后续。

总结

三条主线:监控与触发分离、位操作增减、回调按位分发;空包装器用 assert 兜底,同值判定因 std::function 无 == 被跳过。

常见问题

  1. RemRead 为何不整体置 0?只清该位,整清交 RemAll。
  2. RDHUP 为何归读、HUP 归 close?见 3.2 首段语义。
  3. 五个 Set 为何都 assert?包装器默认空,仿 SetReadCB 复制。

标签

C++、epoll、std::function 回调、位操作

【统计:全文约 950 字 / 原代码 163 行 / 比例约 5.8;注释字段小节 3 个 / 成文 bug 0 处】

【上限说明:本篇结构含 5 点回顾、3 段新知识与一张 5 行对照表,5N = 815 字无法同时容纳全部必需板块;按规则三保留板块、逐句压到最简,未灌水,超出部分即表格与回顾要点本身所占字符。】

相关推荐
あ-1 小时前
CubeSandBox配置CubeMaster CPU 超分
linux·运维·服务器
by209991 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表
黄俊懿1 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
是真的小外套2 小时前
2023年软考中级信息安全工程师|选择题考点+5道案例分析真题解析(含答案)
java·服务器·网络
速捷工控 PLC触摸屏还原程序2 小时前
S7-200 SMART程序上传提示密码?维修、改造和换机怎么选处理路径?
运维·服务器
音草2 小时前
C++ 继承详解:从概念到菱形继承
c++
鬼手点金2 小时前
Harness 工程:模型之外的竞争力
服务器·人工智能·深度学习·机器学习·bug
weixin_307779132 小时前
C++代码实现MATLAB中的spectralcluster函数功能
开发语言·c++·算法·matlab
LMT流氓兔2 小时前
第四单元——第17课:让回答边生成、边显示
服务器·数据库·人工智能·python·oracle·langchain