创建了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. CF1187E Tree Painting

    思路: 树形dp,首先使用dp计算以1为根的时候的最大分数,同时得到各个子树i的最大分数dp[i].然后利用前面得到的dp数组分别计算以其他每个点作为根的时候的最大分数. 实现: #include & ...

  2. 【Qt开发】Qt5 中对 C++11 一些新特性的封装

    C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...

  3. OpenCV3编程入门.知识点

    1. 第三部分 掌握 imgproc 组件 第六章 图像处理 6.1.线性滤波: Pdf.P170 Pdf.P171 平滑处理(smoothing)(模糊处理(bluring))-- 使用频率很高 - ...

  4. 启动Nginx 出现 nginx: [emerg] unknown directive "锘?user" 错误

    出现这种情况 一般是修改配置文件 nginx.conf 造成的 如果你修改文件后出现 那基本上就是这个原因 启动不了 重新打开 改为UTF-8 无BOM编码

  5. Linux sar命令

    yum install sysstat 安装 sar [root@wang /]# sar -n DEV Linux -.el6.x86_64 (wang) 2016年12月21日 _x86_64_ ...

  6. JAVA日常之四

    构造函数 又称“构建器”,函数名称与类名称完全相同,无返回值. 每个类都有构造函数. 可以自定义构造函数,并且可以创建多个重载/过载的构造函数. 若没有手动创建该函数,总会存在一个默认的构造函数(无参 ...

  7. 将mysql中一行中的几个字段 转换成一列并从其他数据库中查对应的邮件信息

    --将项目中的总监,经理,等的邮箱合并为一行 SELECT GROUP_CONCAT(t.USER_EMAIL SEPARATOR ' ') mail_address FROM portal.t_ac ...

  8. RabbitMQ 幂等性概念及业界主流解决方案

    RabbitMQ 幂等性概念及业界主流解决方案 2019年01月24日 15:57:03 JAVA@架构 阅读数:506   一.什么是幂等性 可以参考数据库乐观锁机制,比如执行一条更新库存的 SQL ...

  9. HDU 1325 有根树的判断

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...

  10. HDU 3333-Turing Tree-线段树+离散+离线

    Description After inventing Turing Tree, 3xian always felt boring when solving problems about interv ...