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 )。

相关文章
|
测试技术 Linux 内存技术
怎样设置freeswitch 的高并发数
怎样设置freeswitch 的高并发数
|
存储 编解码 数据可视化
低代码多分支协同开发的建设与实践
低代码多分支协同开发的建设与实践
1706 0
低代码多分支协同开发的建设与实践
|
5月前
|
存储 人工智能 关系型数据库
春节带娃不崩溃指南:用 MySQL 一键部署AI驱动的儿童科普动画片,娃安静一整天!
“知深识易”是面向3–12岁儿童的AI科普内容生成系统,解决知识碎片化、制作门槛高、注意力不匹配三大难题。基于RDS MySQL向量数据库,融合私域教材与公域权威资源,通过RAG+记忆增强+多模态生成,实现“提问→智能召回→脚本生成→视频/图文输出”端到端闭环。(239字)
春节带娃不崩溃指南:用 MySQL 一键部署AI驱动的儿童科普动画片,娃安静一整天!
|
安全 网络协议 Ubuntu
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
4378 3
|
存储 缓存 关系型数据库
什么是InnoDB
【10月更文挑战第17天】什么是InnoDB
|
编译器 C++
VS Code设置C++编译器路径
VS Code设置C++编译器路径
1528 0
|
前端开发 安全 Java
如何在Java中实现高效率的文件上传和下载
如何在Java中实现高效率的文件上传和下载
|
监控 安全 数据安全/隐私保护
关于云锁
背景 主机,储存数据和承载关键业务系统的主体,是企业IT系统的重要资产。主机的安全一直被认为是整个信息安全领域的最后一道防线。主机的漏洞和弱点一直是攻击者和信息资产所有者激烈争夺的阵地。主机安全规划与加固是专业安全顾问通过对承载重要信息系统的主机进行安全评估,根据客户特定的安全要求,制定主机安全规划与加固方案,采取对系统漏洞进行补丁修补,并优化和加强账号口令、日志、网络性能、文件系统、权限控制、服务进程等等。
|
网络协议 PHP 网络虚拟化
MPLS VPN 跨域OptionB
使用跨域方式B实现两家公司的通信