Muduo类详解之Poller

简介: Muduo类详解之Poller

       负责监听文件描述符事件是否触发以及返回发生事件的文件描述符以及具体事件的模块就是Poller,所以一个Poller对象对应一个事件监听器。

class Epoll {
public:
 Epoll();
 ~Epoll();
 void epoll_add(const sp_Channel& request);
 void epoll_mod(const sp_Channel& request);
 void epoll_del(const sp_Channel& request);
 void poll(std::vector<sp_Channel>& req);
private:
 int epollFd_;
 std::vector<epoll_event> events_; // epoll_wait()返回的活动事件都放在这个数组
 std::unordered_map<int, sp_Channel> channelMap_;
};
  • Poller/EpollPoller的重要成员变量
  • epollfd_: 就是用epoll_create方法返回的epoll句柄,这个是常识。
  • channels_:这个变量是std::unordered_map<int, Channel*>类型,负责记录 文件描述符 —> Channel的映射,也帮忙保管所有- 注册在你这个Poller上的Channel。
  • ownerLoop_:所属的EventLoop对象,看到后面你懂了。

其他函数⽆⾮就是对 Epoll_ctl(4) Epoll_wait(4) 的封装。

void Epoll::poll(std::vector<sp_Channel>& req) {
 int event_count =
 Epoll_wait(epollFd_, &*events_.begin(), events_.size(), EPOLLWAIT_TIME);
 for(int i = 0; i < event_count; ++i) {
 int fd = events_[i].data.fd;
 sp_Channel temp = channelMap_[fd];
 temp->setRevents(events_[i].events);
 req.emplace_back(std::move(temp));
 }
 // LOG << "Epoll finished";
}

      Epoll::poll(1) 这个函数可以说是 Poller 的核⼼了,当外部调⽤ poll ⽅法的时候,该⽅法底层其实是通过 epoll_wait 获取这个事件监听器上发⽣事件的 fd 及其对应发⽣的事件,我们知道每个 fd 都是由⼀个 Channel 封 装的,通过哈希表 channelMap_ 可以根据 fd 找到封装这个 fd 的 Channel 。将 IO 多路复⽤模块监听到该 fd 发⽣ 的事件写进这个 Channel 中的 revents 成员变量中。然后把这个 Channel 装进 req 中。这样,当外界调⽤完 poll 之后就能拿到 IO 多路复⽤模块的 监听结果 ( std::vector<sp_Channel>& req )。

相关文章
|
10月前
|
IDE JavaScript 程序员
HarmonyOS Next 如何优雅的编写注释
本文介绍了如何在 HarmonyOS NEXT 中优雅地编写注释,提升代码可读性和维护性。通过使用 jsDoc 或 TypeDoc 规范,开发者可以为项目生成清晰的说明文档。文章详细解析了常见修饰符(如 @param、@returns、@async 等)的用法,并展示了 DevEco Studio 自动生成 ArkTSDoc 文档的功能。遵循这些规范,团队能够更高效协作,同时 IDE 也能提供更好的语法提示支持。
239 20
HarmonyOS Next 如何优雅的编写注释
|
9月前
|
存储 SQL 关系型数据库
拉卡拉 x Apache Doris:统一金融场景 OLAP 引擎,查询提速 15 倍,资源直降 52%
拉卡拉早期基于 Lambda 架构构建数据系统面临存储成本高、实时写入性能差、复杂查询耗时久、组件维护复杂等问题。为此,拉卡拉选择使用 Apache Doris 替换 Elasticsearch、Hive、Hbase、TiDB、Oracle / MySQL 等组件,实现了 OLAP 引擎的统一、查询性能提升 15 倍、资源减少 52% 的显著成效。
398 6
拉卡拉 x Apache Doris:统一金融场景 OLAP 引擎,查询提速 15 倍,资源直降 52%
|
JavaScript 前端开发
Vue的高级表格组件库【vxe-table】
Vue的高级表格组件库【vxe-table】
812 0
|
消息中间件 监控 Java
开发者如何使用云消息队列 RocketMQ 版
【10月更文挑战第12天】开发者如何使用云消息队列 RocketMQ 版
1723 94
|
存储 数据库 数据安全/隐私保护
MVCC实现原理
【10月更文挑战第15天】MVCC 通过维护版本链和相关信息,实现了在多事务并发环境下的数据隔离和并发控制,提高了数据库的性能和可用性。
430 57
|
数据采集 机器学习/深度学习 人工智能
基于AI的网络流量分析:构建智能化运维体系
基于AI的网络流量分析:构建智能化运维体系
1997 13
|
存储 负载均衡 监控
揭秘 Elasticsearch 集群架构,解锁大数据处理神器
Elasticsearch 是一个强大的分布式搜索和分析引擎,广泛应用于大数据处理、实时搜索和分析。本文深入探讨了 Elasticsearch 集群的架构和特性,包括高可用性和负载均衡,以及主节点、数据节点、协调节点和 Ingest 节点的角色和功能。
568 0
|
人工智能 IDE 程序员
通义灵码:AI 研发趋势与效果提升实践丨SDCon 全球软件技术大会演讲全文整理
SDCon 全球软件技术大会上,阿里云通义灵码团队分享了关于 AI 辅助编码的最新研究与实践,随着 AIGC 技术的发展,软件研发领域将迎来智能化的新高度,助力 DevOps 流程优化,提升研发效率和研发幸福感。
14243 11
|
机器学习/深度学习 人工智能 自然语言处理
基于PAI-QuickStart搭建一站式模型训练服务体验
【8月更文挑战第5天】基于PAI-QuickStart搭建一站式模型训练服务体验
408 0
|
前端开发 安全 Java
如何在Java中实现高效率的文件上传和下载
如何在Java中实现高效率的文件上传和下载