[muduo学习笔记]事件分发器(Channel、Poller)

此学习笔记参考施磊老师的muduo教学课程。
目的是搞懂 muduo 网络库的核心框架。EventLoop、channel 和 Poller 之间的关系

文章目录

  • 1 Poller 抽象基类
  • 2 Channel
  • 3 模块的包含
  • muduo模块梳理参考:

整体框架如下:
在这里插入图片描述

muduo是基于 Reactor 模式的网络库,而 EventLoop 是 Reactor 的核心,主要负责事件分发。

在事件分发器中有两个重要部分,分别为 Poller 和 Channel。

1 Poller 抽象基类

说到事件循环,最常见的有 select、poll、epoll 等,在 muduo 中,选择使用抽象基类 Poller 来定义,在派生基类中实现 poll 和 epoll 。

// EventLoop.h 中的定义
std::unique_ptr<Poller> poller_;

// DefaultPoller.cc
#include <stdlib.h>
#include "Poller.h"
#include "EPollPoller.h"

Poller *Poller::newDefaultPoller(EventLoop *loop)
{
    // getenv 环境变量
    if (::getenv("MUDUO_USE_POLL"))
    {
        return nullptr; // 生成poll的实例,这里没有实现
    }
    else
    {
        return new EPollPoller(loop); // 生成epoll的实例
    }
}

在 EPollPoller 中的 epoll 实现,需要考虑 epoll 所感兴趣的事件 event, 在 event 中绑定了一个 sockfd 以及它所感兴趣的事件,这些都封装在 Channel 中。

// channel.h 中的成员变量
const int fd_;                   // fd,Poller监听的对象
int events_;                     // 注册fd感兴趣的事件
int revents_;                    // Poller返回的具体发生的事件

2 Channel

它是 EventLoop 的另一个重要部分,Channel理解为通道 封装了sockfd 和其感兴趣的 event 如 EPOLLIN、EPOLLOUT 事件,还绑定了 poller 返回的具体事件

// EventLoop.h 中的定义
using ChannelList  = std::vector<Channel*>;

所有的成员函数都在这里:
channel中的成员函数

这里只说明一些:
在 Channel 中使用智能指针,是防止我们手动调用了 removeChannel后,还在使用已经被删除的 Channel。它完成跨线程状态的监听。weak_ptr 和 shared_ptr 配合使用,可以解决 shared_ptr 的值循环引用的问题,在多线程中使用 weak_ptr来监听它所观察的资源的状态,使用时尝试提升为 shared_ptr ,提升成功,访问,提升失败,就不访问,说明它所观察的资源已经被释放。

std::weak_ptr<void> tie_;        // 防止手动 remove Channel后仍在执行回调操作。
bool tied_;

智能指针的学习参考:
C++基础——智能指针 shared_ptr 和 weak_ptr 的使用
C++智能指针 shared_ptr,unique_ptr和weak_ptr

当 poller 中有监听事件,channel 就会调用相应的回调。

// 设置fd相应的事件状态 相当于 epoll_ctl add delete
    /*
        const int Channel::kNoneEvent = 0;
        const int Channel::kReadEvent = EPOLLIN | EPOLLPRI;
        const int Channel::kWriteEvent = EPOLLOUT;
    */
    void enableReading()  { events_ |= kReadEvent;   update(); }     // 让 fd 对读事件感兴趣
    void disableReading() { events_ &= ~kReadEvent;  update(); }     // ~:使得read的那一位是0,,再&=上其他位,把相应的位置成0,去掉,
    void enableWriting()  { events_ |= kWriteEvent;  update(); }
    void disableWriting() { events_ &= ~kWriteEvent; update(); }
    void disableAll()     { events_  = kNoneEvent;   update(); }

3 模块的包含

前面说过,EventLoop 是 Reactor 的核心,主要负责事件分发。在事件分发器中有两个重要部分,分别为 Poller 和 Channel。
根据高性能服务器模型:one loop per thread,可以得出一个线程中有一个EventLoop ,一个EventLoop 中有一个poller,一个 poller 上可以监听很多 channel。
所一个channel有一个 EventLoop,一个 EventLoop 有多个channel。

muduo模块梳理参考:

重写muduo网络库:各模块交互流程梳理总结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端|HTML系列第2篇】HTML零基础入门之标签元素

大家好&#xff0c;欢迎来到前端入门系列的第二篇博客。在这个系列中&#xff0c;我们将一起学习前端开发的基础知识&#xff0c;从零开始构建网页和Web应用程序。本篇博客将为大家介绍HTML&#xff08;超文本标记语言&#xff09;常用标签元素&#xff0c;帮助零基础小白快速入…

基于深度学习的高精度抽烟行为检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度抽烟行为检测识别系统可用于日常生活中或野外来检测与定位抽烟行为目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的抽烟行为目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

虚幻引擎(UE5)-大世界分区WorldPartition教程(一)

文章目录 WC与WP的区别一、如何开启WP1.默认创建WP2.手动创建WP3.转换创建WP 二、设置World Partition参数三、启动流送总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 WC与WP的区别 WorldCompostion&#xff08;WC&#xff09; 是UE4中制作大世界…

Apifox|API 文档和开发闭环初体验

Apifox是一款集文档、接口定义、数据模拟、自动化测试为一体的接口协作平台。 据功能介绍&#xff0c;基本总结Apifox Postman Swagger Mock JMeter 既然评的文章那么多&#xff0c;掀起了一阵子热度&#xff0c;究竟哪些功能&#xff1a; 用下来有哪些体会&#xff1a;…

第7章 Scala集合

第7章 Scala集合 7.1 简介 ​ ​ scala.collection.immutable ​ scala.collection.mutable ​ 7.2 数组 ​ 不可变数组 package chapter07object Test01_ImmutableArray {def main(args: Array[String]): Unit {// 1. 创建数组val arr: Array[Int] new Array[Int](10…

多项目管理难在哪,多项目同时进行该如何做好进度管理?

最近&#xff0c;听到群里的项目经理吐槽&#xff0c;手上有10多个项目同时进行&#xff0c;工作起来手忙脚乱&#xff0c;杂乱无章&#xff0c;让他压力特别大。 对于项目经理来说&#xff0c;多项目并行推进的情况已是常态。从工作层面来说&#xff0c;不仅在各项目之间抢资…

SpringBoo集成MongoDB

一、集成简介 spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb&#xff0c;MongoRepository操作简单&#xff0c;MongoTemplate操作灵活&#xff0c;我们在项目中可以灵活适用这两种方式操作mongodb&#xff0c;MongoRepository的缺点是不够灵活…

购物车业务

一、分析购物车vo &#xff08;1&#xff09;添加成功页 public class CartItemVo implements Serializable {/*** 商品id*/private Long skuId;/*** 是否选中*/private Boolean check true;/*** 商品标题*/private String title;/*** 商品图片*/private String image;/***…

如何优雅的将 Docker 镜像从 1.43G 瘦身到 22.4MB

Docker 镜像的大小对于系统的 CI/CD 等都有影响&#xff0c;尤其是云部署场景。我们在生产实践中都会做瘦身的操作&#xff0c;尽最大的可能使用 Size 小的镜像完成功能。下文是一个简单的 ReactJS 程序上线的瘦身体验&#xff0c;希望可以帮助大家找到镜像瘦身的方向和灵感。 …

C++之GNU C的__attribute__((constructor))优先级使用(一百四十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【期末不挂科 学习数据结构】

期末不挂科 学习数据结构 第一章绪论1.1数据结构的基本概念1.1.1基本概念和术语1.数据2.数据元素3.数据对象4.数据类型5.数据结构 1.1.2数据结构三要素1.数据的逻辑结构2.数据的存储结构3.数据的运算 第一章绪论 1.1数据结构的基本概念 1.1.1基本概念和术语 1.数据 数据是信…

Flutter学习四:Flutter开发基础(四)包管理

目录 0 引言 1 包管理 1.1 简介 1.2 Pub仓库 1.3 依赖Pub仓库 1.3.1 查找包 1.3.2 添加包 1.3.3 下载包 1.3.4 引入包 1.3.5 使用包 1.4 其他依赖方式 1.4.1 依赖本地包 1.4.2 依赖git仓库 1.4.3 不常用的依赖方式 0 引言 本文是对第二版序 | 《Flutter实战第二版…

【ArcGIS】使用ArcMap进行北京1954-120E坐标转WGS84坐标系

背景 在进行青岛地市GIS数据迁移&#xff0c;涉及坐标转换&#xff0c;经过几天摸索终于找到迁移方法 投影坐标系 北京1954-120E坐标 对应为高斯-克吕格投影 300000 3000001 0 0&#xff08;青岛本地坐标&#xff09; 增量:-300000 -3000001&#xff08;此处为示例&#xff0c…

(15)第一人称视角视频

文章目录 前言 15.1 推荐的零件 15.2 连接图示 15.3 通过任务计划器最小化OSD设置 15.4 集成式OSD 15.5 用户视频/博客 15.6 与FPV飞行特别相关的安全警告 15.7 政府/地方法规 前言 第一人称视角在飞行时为你提供了真正的飞行员视角&#xff0c;它将视频摄像机和发射器…

什么是信号槽机制,如何实现,有什么用?(Qt面试题)

1. 什么是信号槽机制&#xff1f; 信号槽机制&#xff08;Signal-Slot mechanism&#xff09;是一种在软件开发中常用的设计模式&#xff0c;用于实现对象间的通信和事件处理。该机制最初由Qt框架引入并广泛应用&#xff0c;后来也被其他编程框架和库所采用。 信号槽机制通过定…

Spring Boot 属性配置解析

基于Spring Boot 3.1.0 系列文章 Spring Boot 源码阅读初始化环境搭建Spring Boot 框架整体启动流程详解Spring Boot 系统初始化器详解Spring Boot 监听器详解Spring Boot banner详解 属性配置介绍 Spring Boot 3.1.0 支持的属性配置方式与2.x版本没有什么变动&#xff0c;按照…

C#使用XML和Treeview结合实现复杂数据采集功能

一个项目的数据表暂时没有定下来&#xff0c;但是有了一些确定性&#xff1a;   1、比较复杂&#xff0c;可能变化&#xff1b;   2、大部分是选择项目&#xff0c;因为输入项目都差不多&#xff1b;   3、应用程序是C/S的窗体应用。   对于这样的用户需求&#xff0c;…

搭建个人hMailServer 邮件服务实现远程发送邮件

文章目录 1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 转载自cpolar极点云文章&#xff1a;搭建个人hMailServer 邮件服务实现远程发送邮件 hM…

如何在编程中中实现负载均衡和容错处理

什么是容错 容错是指系统&#xff08;计算机、网络、云集群等&#xff09;在其一个或多个组件发生故障时继续运行而不会中断的能力。 创建容错系统的目的是防止由单点故障引起的中断&#xff0c;确保任务关键型应用程序或系统的高可用性和业务连续性。 容错系统使用备份组件…

【Twitter爬虫】Twitter网络爬虫

利用selenium爬取Twitter 从2月9日起&#xff0c;Twitter不再支持免费访问Twitter API&#xff0c;继续使用Twitter API支付较高的费用。下面将介绍一种绕过Twitter API爬取推文的方式 Selenium Webdriver框架 首先介绍一下Selenium Webdriver&#xff0c;这是一款web自动化…