创建了EventLoop对象的线程是IO线程,其主要功能是运行事件循环EventLoop::loop(), one loop per thread
事件循环必须在IO线程中运行

Reactor关键结构

Channel

  • 每个Channel对象自始至终只属于一个EventLoop, 只负责一个fd的IO事件分发(如ReadCallback, WriteCallback),但它并不拥有这个fd, 也不会在析构时关闭这个fd
  • 成员函数都只在IO线程中使用,因此更新数据成员不用加锁

Poller

  • IO复用的封装,Poller并不拥有Channel,Channel在析构之前必须先unregister(EventLoop::removeChannel),避免空悬指针
  • 目前供EventLoop调用的有poll和updateChannel
  • poll函数:进行IO复用,并调用fillActiveChannel函数, 填充activeChannels, 返回return的时刻
  • fillActiveChannel函数:监听pollfds数组,将在活跃的fd对应的channel中设置该fd对应活跃的事件,并将这个channel加入activeChannels中来进行后续的事件分发,只负责IO复用,不负责IO分发,一方面防止分发事件改变Channel, 另一方面简化Poller职责,方便替换为其他高效的IO机制(如epoll)
  • updateChannel函数:更新并pollfds数组(可以增加一个新的fd,或者更改原有的pollfd),输入为channel,更新时也要更新Channel
  • channel中有个idx记录了其在pollfds的位置,方便更新

EventLoop

  • 拥有activeChannels,poller
  • EventLoop:loop()调用poller::poll()获得当前活动事件的Channel列表,然后调用每个Channel的handleEvent函数

TimerQueue定时器

传统的是通过select和poll的等待时间来实现定时的,现在可以使用timefd以与IO事件相同的方式来处理定时,
TimerQueue需要高效组织目前尚未到期的Timer,能够快速找到已经到期的Timer, 还要高效删除增加Timer
muduo采用map<Timestamp, Timer>,但不是直接使用,因为这样无法处理Timestamp到期时间相同的情况,可以用multimap, muduo采用区分key的方法,将<Timestamp, Timer>作为一个key存储为一个Set

TCP网络库

Acceptor

用于接受新的TCP连接,并通知回调给使用者,供TcpServer使用,生命期由后者控制
数据成员有Socket和Channel, Socket是一个RAII handle, 封装的socket是一个listening socket(server socket),用于观察此socket上的readable事件

TcpServer

管理accept(2)获得的TcpConnection, 供用户使用,生命周期由用户控制,用户只需要设置好callback, 再调用start()即可
新连接到达时,Acceptor会回调newConnection(), 创建TcpConnection并将其加入到ConnectionMap中,设置callback
TcpServer内部使用Acceptor来获得fd, start时让Acceptor去runInLoop

TcpConnection

TcpConnection是最核心也是最复杂的类,也是muduo中唯一默认使用shared_ptr来管理的class, 并且唯一继承enable_shared_from_this,因为其生命周期模糊
TcpConnection表示的是一次TCP连接,断开了就没用了,自己处理可写事件,可读事件通过MessageCallback传达给客户(也就是用户提供MessageCallback)

Muduo阅读的更多相关文章

  1. Muduo阅读笔记--base(二)

    上一篇文章对muduo的入门做了介绍. http://www.cnblogs.com/LCCRNblog/p/5668035.html base文件夹下这么多代码,该如何入手呢?对于我这种第一次接触大 ...

  2. Muduo阅读笔记---入门(一)

    第一步:下载源码和文档 下载muduo项目的源码.<muduo-manual.pdf>文档,以及<Linux多线程服务端编程:使用muduo C++网络库.pdf>,这些是前期 ...

  3. Muduo阅读笔记---net(三)

    muduo-manual手册一开始就介绍了“Muduo是基于Reactor模式的网络库”,因此必须对Reactor模式有一定的了解才行:另外,文中还提到EventLoop,这些知识点我目前都不太了解.

  4. 陈硕muduo

    https://github.com/chenshuo/muduo muduo 阅读 https://www.cnblogs.com/qbits/p/11101678.html

  5. 《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市

    <Linux 多线程服务端编程:使用 muduo C++ 网络库> 电子版已在京东和亚马逊上市销售. 京东购买地址:http://e.jd.com/30149978.html 亚马逊Kin ...

  6. muduo库整体架构简析

    muduo是一个高质量的Reactor网络库,采用one loop per thread + thread loop架构实现,代码简洁,逻辑清晰,是学习网络编程的很好的典范. muduo的代码分为两部 ...

  7. muduo网络库架构总结

    目录 muduo网络库简介 muduo网络库模块组成 Recator反应器 EventLoop的两个组件 TimerQueue定时器 Eventfd Connector和Acceptor连接器和监听器 ...

  8. muduo 的 shutdown() 没有直接关闭 TCP 连接?

    http://blog.csdn.net/Solstice/article/details/6208634 今天收到一位网友来信: 在 simple 中的 daytime 示例中,服务端主动关闭时调用 ...

  9. 长文梳理muduo网络库核心代码、剖析优秀编程细节

    前言 muduo库是陈硕个人开发的tcp网络编程库,支持Reactor模型,推荐大家阅读陈硕写的<Linux多线程服务端编程:使用muduo C++网络库>.本人前段时间出于个人学习.找工 ...

随机推荐

  1. 除了 UCAN 发布的鹿班和普惠体,这些设计工具也来自阿里

    在 4 月 27 日的 UCAN 2019 设计大会上,阿里巴巴对外发布了一款全新免费字体——阿里巴巴普惠体.其实,作为经济体的阿里巴巴,这些年早已默默推出了很多实用的设计工具,比如大名鼎鼎的 Ico ...

  2. POJ 1734:Sightseeing trip

    Sightseeing trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: Accepted: Special Judge ...

  3. 环境变量配置文件profile

    环境变量配置文件 在Ubuntu中有如下几个文件可以设置环境变量1./etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时, ...

  4. oauth2中org.springframework.security.core.userdetails.User无法转换为封装的AuthorizationInfoBean

    用springboot + oauth2 + redis搭建了一个项目,创建一个自定义的AuthorizationInfoBean继承org.springframework.security.core ...

  5. fzu1704(高斯消元法解异或方程组+高精度输出)

    题目链接:https://vjudge.net/problem/FZU-1704 题意:经典开关问题,求使得灯全0的方案数. 思路:题目保证至少存在一种方案,即方程组一定有解,那么套上高斯消元法的板子 ...

  6. *#【Python】【基础知识】【运算符】【Python的几类运算符】

    Python的运算符分为以下几类: 算术运算符比较(关系)运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符 以及需要考虑的:运算符优先级 一.算术运算符: 需要注意的,上图是Python 2.0 ...

  7. mysql innodb数据库损坏导致无法启动

    生产环境中的mysql突然启动不了,查了原因是innodb库错误,以前就遇到过这个问题,稀里糊涂的没解决,结果导致大量数据丢失.这些又遇到这个问题,果断把那个有问题的数据库移动了别的地方,启动了mys ...

  8. jupyter lab 安装

    在windows下安装jupyter 特别简单 首先你需要有Anaconda or python的环境变量,这里我就不说怎么安装环境变量了,网上一大堆教程 启动黑窗口,下载jupyter pip in ...

  9. python — 生成器、推导式、递归

    目录 1 生成器(函数的变异) 2 推导式 3 递归 1 生成器(函数的变异) 判断一个函数是否是生成器函数:只需看函数内部是否有yield # 生成器函数(内部是否包含yield) def func ...

  10. spark机器学一Mllib 数据抽象

    spark 提供了两个机器学习库 MLlib 和 ML,MLlib 是 spark 第一个机器学习库,相比于 ML,它更加成熟 rdd 是 spark core 的数据抽象,dataframe 是 s ...