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

这篇具有很好参考价值的文章主要介绍了[muduo学习笔记]事件分发器(Channel、Poller)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


整体框架如下:
[muduo学习笔记]事件分发器(Channel、Poller)

muduo是基于 Reactor 模式的网络库,他有三个核心组件支撑一个 reactor 实现持续的监听一组fd,并根据每个 fd 上发生的事件调用相应的处理函数。这三个组件分别是 Channel 类、Poll类以及EventLoop类。
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网络库:各模块交互流程梳理总结文章来源地址https://www.toymoban.com/news/detail-510789.html

到了这里,关于[muduo学习笔记]事件分发器(Channel、Poller)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于channel的异步事件总线

    通道是生成者/使用者概念编程模型的实现。 在此编程模型中,生成者异步生成数据,使用者异步使用该数据。 换句话说,此模型将数据从一方移交给另一方。 尝试将通道视为任何其他常见的泛型集合类型,例如 List 。 主要区别在于,此集合管理同步,并通过工厂创建选项

    2024年02月08日
    浏览(27)
  • Android 事件分发

    本篇文章主要简单介绍下Android中的事件分发,和大家一起学习,进步,有问题也希望大家及时指证修改. 1: onClick和OnTouch 首先我们在单独的activity中添加个按钮button.增加点击事件setOnClickListener: 接着添加OnTouch: 我们执行下点击事件.可以看到输出如下: 2024-04-09 20:54:11.219 17770-17770/?

    2024年04月11日
    浏览(38)
  • Android 事件分发介绍

    目录 一、目的 二、环境 三、相关概念 3.1 事件分发 四、详细设计 4.1应用布局 4.1.1 应用布局结构 4.1.2 LayoutInspector 4.2 关键View方法 4.2.1 相关View 4.2.2 相关方法 4.2.3 View与方法关系 4.3 事件分发概念图 4.3.1 事件分发类图 4.3.2 事件分发模型图 4.4 Activity组件 4.4.1 Activity-dispatchTouch

    2024年02月03日
    浏览(28)
  • 安卓之事件分发机制

    事件分发的”事件“是指什么? 答:点击事件(Touch事件)。 当用户触摸屏幕(VIew或ViewGroup)时,将产生点击事件,即Touch事件。Touch事件的细节(如:触摸位置、事件等)会被封装成MotionEvent对象。 常见的事件: MotionEvent.ACTION_DOWN:按下。 MotionEvent.ACTION_UP:抬起。 MotionE

    2024年02月15日
    浏览(32)
  • Android触摸事件分发机制(一)

    本文主要分享事件分发中的基本概念。 介绍负责参与分发事件的主要方法。 从这些方法的核心逻辑中,总结事件分发的规律。 被分发的对象是那些?被分发的对象是用户触摸屏幕而产生的点击事件,事件主要包括:按 下、滑动、抬起与取消。这些事件被封装成 MotionEvent 对

    2024年02月15日
    浏览(24)
  • Android事件分发-基础原理和场景分析

    作者:京东零售 郭旭锋 和其他平台类似,Android 中 View 的布局是一个树形结构,各个 ViewGroup 和 View 是按树形结构嵌套布局的,从而会出现用户触摸的位置坐标可能会落在多个 View 的范围内,这样就不知道哪个 View 来响应这个事件,为了解决这一问题,就出现了事件分发机制

    2023年04月21日
    浏览(31)
  • Android进阶 View事件体系(二):从源码解析View的事件分发

    本篇文章为总结View事件体系的第二篇文章,前一篇文章的在这里:Android进阶 View事件体系(一):概要介绍和实现View的滑动 本篇文章将专注于介绍View的点击事件的分发,介绍的内容主要有: 点击事件的传递原则 解析Activity的构成 源码解析View的事件分发 源码解析View对点击

    2024年02月06日
    浏览(36)
  • 带你深入了解Android的事件分发机制

    Android的事件分发机制是指在Android系统中,如何将用户的触摸事件、按键事件等传递给正确的View进行处理的一套机制。它是Android应用程序中实现交互的重要部分,确保用户的操作能够被正确地捕获和处理。 Android的事件分发机制涉及到以下几个核心概念:事件源、事件分发、

    2024年02月16日
    浏览(30)
  • Android事件分发机制五:面试官你坐啊

    学过事件分发吗,聊聊什么是事件分发 事件分发是将屏幕触控信息分发给控件树的一个套机制。 当我们触摸屏幕时,会产生一些列的MotionEvent事件对象,经过控件树的管理者ViewRootImpl,调用view的dispatchPointerEvnet方法进行分发。 那主要的分发流程是什么: 在程序的主界面情况

    2024年04月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包