Muduo网络库简介

muduo 是一个基于 Reactor 模式的现代 C++ 网络库,作者陈硕。它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。
muduo网络库的核心代码只有数千行,在网络编程技术学习的进阶阶段,muduo是一个非常值得学习的开源库。目前我也是刚刚开始学习这个网络库的源码,希望将这个学习过程记录下来。这个网络库的源码已经发布在GitHub上,可以点击这里阅读。目前Github上这份源码已经被作者用c++11重写,我学习的版本是没有使用c++11版本的。不过二者大同小异,核心思想是没有变化的。点这里可以看我的源代码。从笔记十七开始记录muduo的net库的实现过程。如果你需要看一下基础库(base)的复现过程,可以点击这里:muduo的base库实现过程。

什么都不做的EventLoop

muduo网络库采用的是one loop per thread + threadpool的模式,也就是说主线程属于main loop,创建listenfd,创建listenfd的可读回调函数,该回调函数执行accept返回交流套接字,同时new一个http对象(与交流套接字绑定),添加进thread loop,从此这个交流套接字由thread loop负责,在thread loop中进行客户端和服务端的交流。
EventLoop就是这样的事件处理对象,每个线程仅能创建一个EventLoop。创建了EventLoop对象的线程称为IO线程,功能是运行事件循环。
EventLoop的实现比较复杂,今后的博客将一步步实现的。今天先简单讲解一些EventLoop对象的一些公开接口,所以今天的标题是“什么都不做的EventLoop”。

EventLoop类

如前所述,Event类的特征是不可拷贝、每个线程仅能创建一个、接口不可跨线程调用。让我们看看它的这些缺点是如何实现的。

class EventLoop : boost::noncopyable
{
public:EventLoop();~EventLoop();void loop();void assertInLoopThread(){if(!isInLoopThread()){abortNotInLoopThread();}}bool isInLoopThread() const {return threadId_ == CurrentThread::tid();}static EventLoop* getEventLoopOfCurrentThread();
private:void abortNotInLoopThread();bool looping_;const pid_t threadId_;
};

EventLoop构造函数与析构函数

为了保证EventLoop在每个线程中仅有一个,在EventLoop.cc中定义了一个线程局部变量__thread EventLoop* t_loopInThisThread = 0;当EventLoop对象创建时,将它赋值this指针;若在一个线程中再创建一个EventLoop,这时t_loopInThisThread不为空,出现fatal。同时创建对象时,初始化了本线程的线程号threadId_。

EventLoop::EventLoop():  looping_(false),threadId_(CurrentThread::tid())
{LOG_TRACE<< "EventLoop created" << this << "in thread" << threadId_;if(t_loopInThisThread){LOG_FATAL<<"Another EventLoop" << t_loopInThisThread<< "exsits in this thread" << threadId_;    }else{t_loopInThisThread = this;}
}EventLoop::~EventLoop()
{t_loopInThisThread = NULL;
}

loop函数

loop的作用就是执行事件循环,进行客户与服务端的交流。当前的loop还比较简单,我们仅用它阻塞5秒钟。前面说过loop函数不可跨线程调用,也就是说假如你在主线程创立一个全局EventLoop,然后在另一个线程中调用它的loop,将会出现错误。assertInLoopThread()将会检查创立时的线程号与当前线程号是否一致,如果不一致,会出现fatal。

void EventLoop::loop()
{assert(!looping_);assertInLoopThread();looping_ = true;LOG_TRACE << "EventLoop" << this << "start looping";::poll(NULL,0,5*1000);LOG_TRACE << "EventLoop" << this << "stop looping";looping_ = false;
}

muduo网络库源码复现笔记(十七):什么都不做的EventLoop相关推荐

  1. muduo网络库源码阅读Step by Step

    Posted on: Nov 26 2015 Categories: muduo C++ Tags: muduo 一般写服务端程序都需要有一个称手的网络库来帮我们处理琐碎的网络通信细节,比如连接的建立 ...

  2. 刚出锅的 Axios 网络请求源码阅读笔记

    项目中一直都有用到 Axios 作为网络请求工具,用它更要懂它,因此为了更好地发挥 Axios 在项目的价值,以及日后能够得心应手地使用它,笔者决定从源码层面好好欣赏一下它的美貌! Axios是一款基 ...

  3. Swift标准库源码阅读笔记 - Array和ContiguousArray

    关于 ContiguousArray ,这边有喵神的文章介绍的很详细了,可以先看看这个文章. Array 接着喵神的思路,看一下 Array 以下是从源码中截取的代码片段. public struct ...

  4. pytorch下的lib库 源码阅读笔记(1)

    置顶:将pytorch clone到本地,查看initial commit,已经是麻雀虽小五脏俱全了,非常适合作为学习模板. 2017年12月7日01:24:15 2017-10-25 17:51 参 ...

  5. 基于C++11的muduo网络库

    文章目录 写在前面 项目编译问题 库安装的问题 项目测试代码 关于压力测试 项目概述 muduo网络库的reactor模型 muduo的设计 muduo各个类 辅助类 NonCopyable Time ...

  6. muduo网络库使用入门

    muduo网络库介绍 muduo网络库是陈硕大神开发的基于主从Reactor模式的,事件驱动的高性能网络库. 网络编程中有很多是事务性的工作,使用muduo网络库,用户只需要填上关键的业务逻辑代码,并 ...

  7. Vuex 4源码学习笔记 - 通过dispatch一步步来掌握Vuex整个数据流(五)

    在上一篇笔记中:Vuex 4源码学习笔记 - Store 构造函数都干了什么(四) 我们通过查看Store 构造函数的源代码可以看到主要做了三件事情: 初始化一些内部变量以外 执行installMod ...

  8. 【Muduo源码剖析笔记】 网络库之Acceptor、Connector

    [Muduo源码剖析笔记] 网络库之Acceptor.Connector Acceptor typedef std::function<void (int sockfd, const InetA ...

  9. android 三方_面试官送你一份Android热门三方库源码面试宝典及学习笔记

    前言 众所周知,优秀源码的阅读与理解是最能提升自身功力的途径,如果想要成为一名优秀的Android工程师,那么Android中优秀三方库源码的分析和理解则是必备技能.就拿比较热门的图片加载框架Glid ...

最新文章

  1. Selenium Firefox启动提示导入收藏夹
  2. linux shell 字符串比较相等、不相等
  3. 【深度思考】javaweb框架技术心得
  4. centos打显卡驱动命令_ubuntu16.04安装显卡以及驱动经验
  5. 程序基础:数据结构(郝斌讲解)(一)
  6. 自制操作系统学习笔记(1)-虚拟机启动软盘
  7. Z-BlogPHP名扬图文博客主题模板
  8. 计算机网络知识如何建立数据库,如何将本机的SQL Server数据库上传到网站的数据服务器?...
  9. python查看网络连接_python – 检查网络连接
  10. mac osx vi 设置tab 四个空格
  11. 【精】18款在线网页SVG编辑器
  12. 2021三跨985重庆大学917计算机上岸经验分享
  13. loadRunner之中文语言包安装
  14. 两年嵌入式软件开发的工作感想
  15. 数模优秀论文分析(国赛C题)
  16. JAVA餐厅线上点菜系统计算机毕业设计Mybatis+系统+数据库+调试部署
  17. 股债收益模型 量化实战篇(一)
  18. css3 border边框斜线,CSS3 斜线分割布局
  19. 必须做的事 教你数据备份
  20. 读书笔记—《销售铁军》随记6

热门文章

  1. 用淘汰的手机做家庭监控
  2. samba文件共享,windows与linux共享
  3. debian11安装samba(smb)协议的网络共享
  4. 计算机科学计数法是哪个键,卡西欧计算器中的科学计数法键如何使用?请举例!急!...
  5. 利用C/C++实现贪吃蛇
  6. Postman高级应用(5):再也不用注释签名代码了——自动生成签名
  7. IT人员必须关注的五个IT新技术方向
  8. Short 类型直接和数值1做对比
  9. 电子行业求职,技术才是硬道理
  10. C语言二叉树叶子节点的求法