1.7.C++项目:仿muduo库实现并发服务器之Poller模块的设计

项目完整在:

文章目录

  • 一、Poller模块:描述符IO事件监控模块
  • 二、提供的功能
  • 三、实现思想
    • (一)功能
    • (二)意义
    • (三)功能设计
  • 四、封装思想
  • 五、代码
    • (一)框架
    • (二)完整代码

一、Poller模块:描述符IO事件监控模块

在这里插入图片描述

二、提供的功能

对任意的描述符进行IO事件监控。

三、实现思想

(一)功能

对任意的描述符进行IO事件监控。

(二)意义

对epoll进行的封装,让对描述符进行事件监控的操作更加简单。

(三)功能设计

  1. 添加事件监控—— channel模块
  2. 修改事件监控
  3. 移除事件监控
  4. 取消定时任务

四、封装思想

封装思想: 1. 必须拥有一个epoll的操作句柄2. 拥有一个struct epoll_event 结构数组,监控保存所有的活跃事件!3. 使用hash表管理描述符与描述符对应的事件管理Channnel对象!
逻辑流程:1. 对描述符进行监控,通过Channnel才能知道描述符监控什么事件2. 当描述符就绪了,通过描述符在hash表中找到对应的Channel(得到了Channel才知道什么事件如何处理)当描述符就绪了,返回就绪描述符对应的Channel

五、代码

(一)框架

框架:
class Poller {
private:int _epfd;struct epoll_event_evs[xxx];std::unordered_map<int,Channel*> mp;
private:// 1. 判断要更新事件的描述符是否存在// 2. 针对epoll直接操作(添加,修改,移除)
public:// 1. 添加或者更新描述符所监控的事件void Update(Channel* channel);// 2. 移除描述符所监控的事件void Remove(Channel* )// 3. 开始监控,获取就绪Channel
};
*/
/*

(二)完整代码

#define MAX_EPOLLEVENTS 1024
// Poller模块是对epoll进⾏封装的⼀个模块,主要实现epoll的IO事件添加,修改,移除,获取活跃连接功能。
class Poller {
private:int _epfd;struct epoll_event _evs[MAX_EPOLLEVENTS];std::unordered_map<int,Channel*> _channels;
private:// 对epoll直接操作void Update(Channel* channel,int op) {int fd = channel->Fd();struct epoll_event ev;ev.data.fd = fd;ev.events = channel->Events();int ret = epoll_ctl(_epfd,op,fd,&ev);if (ret < 0) {ERR_LOG("EPOLLCTL FAILED!!!");abort(); // 推出程序!!}}// 判断一个Channel是否已经添加到了事件监控bool hashChannel(Channel* channel) {auto it = _channels.find(channel -> Fd());if (it == _channels.end()) {return false;}return true;}
public:Poller() {_epfd = epoll_create(MAX_EPOLLEVENTS);if (_epfd < 0) {ERR_LOG("EPOLL CREATE FAILED!!");abort();//退出程序}}// 添加或者修改监控事件void UpdateEvent(Channel* channel) {  // 有描述符也有事件bool ret = hashChannel(channel);if (ret == false) {_channels.insert(std::make_pair(channel->Fd(),channel));return Update(channel,EPOLL_CTL_ADD); // 不存在添加}return Update(channel,EPOLL_CTL_MOD); // 存在了更新}// 移除监控事件void removeEvent(Channel *channel) {auto it = _channels.find(channel->Fd());if (it != _channels.end()) {_channels.erase(it);}Update(channel, EPOLL_CTL_DEL);}// 开始监控,返回活跃链接!void Poll(std::vector<Channel*> *active) {// int epoll_wait(int epfd, struct epoll_event *evs, int maxevents, int timeout)int nfds = epoll_wait(_epfd, _evs, MAX_EPOLLEVENTS, -1);if (nfds < 0) {if (errno == EINTR) {return ;}ERR_LOG("EPOLL WAIT ERROR:%s\n", strerror(errno));abort();//退出程序}for (int i = 0; i < nfds; i++) {auto it = _channels.find(_evs[i].data.fd);assert(it != _channels.end());it->second->setRevents(_evs[i].events);//设置实际就绪的事件active->push_back(it->second);}return;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/125566.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻量级网络IP扫描器WatchYourLAN

什么是 WatchYourLAN &#xff1f; WatchYourLAN 是一款带有 Web GUI 的轻量级网络 IP 扫描器。支持使用不同的主题和色彩模式进行个性化设置。 准备工作 扫描网络&#xff0c;首先要找到对应的网络接口&#xff0c;一般常见的包括 eth0、lo、docker0 等&#xff0c;可以在 SS…

Spring的依赖注入(DI)以及优缺点

Spring的依赖注入&#xff08;DI&#xff09;&#xff1a;解释和优点 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是Spring框架的核心概念之一&#xff0c;也是现代Java应用程序开发的重要组成部分。本文将深入探讨DI是什么&#xff0c;以及它的…

react项目从webpack迁移到vite的解决方案

虽然webpack是前端工程编译工具的王者&#xff0c;但是最近vite牛逼吹的震天响&#xff0c;说什么开发/生产打包速度甩webpack 100条街。不管是不是事实&#xff0c;总得尝试一下吧。 于是说干就干&#xff0c;在网上找了很多资料&#xff0c;终于搞定了&#xff0c;以下就是r…

[Linux]线程互斥

[Linux]线程互斥 文章目录 [Linux]线程互斥线程并发访问问题线程互斥控制--加锁pthread_mutex_init函数pthread_mutex_destroy函数pthread_mutex_lock函数pthread_mutex_unlock函数锁相关函数使用示例使用锁的细节加锁解锁的实现原理 线程安全概念常见的线程不安全的情况常见的…

C++:stl:stack、queue、priority_queue介绍及模拟实现和容量适配器deque介绍

本文主要介绍c中stl的栈、队列和优先级队列并对其模拟实现&#xff0c;对deque进行一定介绍并在栈和队列的模拟实现中使用。 目录 一、stack的介绍和使用 1.stack的介绍 2.stack的使用 3.stack的模拟实现 二、queue的介绍和使用 1.queue的介绍 2.queue的使用 3.queue的…

“在 ArchiMate EA 建模中的组合关系:构建块和依赖关系

简介 在企业架构&#xff08;EA&#xff09;建模领域&#xff0c;结构关系在描绘架构内静态一致性方面起着至关重要的作用。其中一个关键的结构关系是组合关系&#xff0c;这是 ArchiMate 语言中深植的概念&#xff0c;提供了一个全面的框架&#xff0c;用于表达元素如何组合形…

正点原子嵌入式linux驱动开发——TF-A移植

经过了之前的学习&#xff0c;除了TF-A的详细启动流程仍待更新&#xff0c;TF-A的使用和其对应的大致启动流程已经进行过了学习。但是当我们实际做产品时&#xff0c;硬件平台肯定会和ST官方的有区别&#xff0c;比如DDR容量会改变&#xff0c;自己的硬件没有使用到官方EVK开发…

Ubuntu使用cmake和vscode开发自己的项目,引用自己的头文件和openCV

创建文件夹 mkdir my_proj 继续创建include 和 src文件夹&#xff0c;形成如下的目录结构 用vscode打开项目 创建add.h #ifndef ADD_H #define ADD_Hint add(int numA, int numB);#endif add.cpp #include "add.h"int add(int numA, int numB) {return numA nu…

盒子阴影和网页布局

盒子阴影 box-shadow: 10px 10px 10px 4px rgba(0,0,0,.3);//最后一个是透明度 传统网页布局的三种方式 标准流 就是按照规定好的默认方式排列 1.块级元素&#xff1a;div、hr、p、h1~h2、ul、ol、dl、form、table 行内元素会按照书顺序&#xff0c;从左到右顺序排列&#…

黑豹程序员-架构师学习路线图-百科:Git/Gitee(版本控制)

文章目录 1、什么是版本控制2、特点3、发展历史4、SVN和Git比较5、Git6、GitHub7、Gitee&#xff08;国产&#xff09;8、Git的基础命令 1、什么是版本控制 版本控制系统&#xff08; Version Control &#xff09;版本控制是一种管理和跟踪软件开发过程中的代码变化的系统。它…

博途1200/1500 ALT指令

SMART PLC的ALT指令实现代码,请查看下面文章博客 SMART PLC如何构造ALT指令_smart200类似alt指令-CSDN博客单按钮启停这些老生常谈的问题,很多人感兴趣。这篇博文讨论下不同的实现方法,希望对大家有所帮助。指令虽然简单,但是在编程的时候合理使用对我们高效率编程帮助还是…

C语言学习系列->联合体and枚举

文章目录 前言联合体概述联合体的特点联合体大小的计算优点练习 枚举概述优点使用 前言 在上一篇文章中&#xff0c;小编将结构体的学习笔记整理出来了。现在&#xff0c;小编将枚举和联合体笔记分享给大家。枚举和联合体与结构体一样&#xff0c;都是自定义类型&#xff0c;在…