muduo net库学习笔记7——用于创建服务器的类TcpServer

2023-11-05

muduo为每个EventLoop设计了runInLoopqueueInLoop函数用来将本该在其他线程执行的线程不安全函数放到它所属线程执行,从而达到线程安全。

muduo采用采用one loop per thread的设计思想,即每个线程运行一个循环,这里的循环也就是事件驱动循环EventLoop。所以,EventLoop对象的loop函数,包括间接引发的Pollerpoll函数,Channel的handleEvent函数,以及TcpConnectionhandle*函数都是在一个线程内完成的。而在整个muduo体系中,有着多个这样的EventLoop,每个EventLoop都执行着loop,poll,handleEvent,handle*这些函数。这种设计模型也被成为Reactor + 线程池

控制着这些EventLoop的,换句话说,保存着事件驱动循环线程池的,就是TcpServer类,服务器类。TcpServer类创建一个高并发的服务器,内部有一个线程池,线程池中有大量的线程,每个线程运行着一个事件驱动循环,one loop per thread

另外,TcpServer本身也是一个线程(主线程),也运行着一个EventLoop,这个事件驱动循环仅仅用来监控客户端的连接请求,即Acceptor对象的Channel的可读事件。通常如果用户添加定时器任务的话,也会由这个EventLoop监听
但是TcpServer的这个EventLoop不在线程池中,这一点要区分开,线程池中的线程只用来运行负责监控TcpConnection的EventLoop的


TcpServer的成员变量主要以EventLoopAcceptorTcpConnection, EventLoopThreadLoop为主,其它变量主要是各种用户提供的回调函数,大多都传给每一个TcpConnection对象

typedef std::map<string, TcpConnectionPtr> ConnectionMap;

  EventLoop* loop_;  // the acceptor loop
  //TcpServer所在的主线程下运行的事件驱动循环,负责监听Acceptor的Channel 
  
  const string ipPort_;//服务器负责监听的本地ip和端口
  const string name_;//服务器名字,创建时传入
  
  std::unique_ptr<Acceptor> acceptor_; // avoid revealing Acceptor
  //Acceptor对象,负责监听客户端连接请求,运行在主线程的EventLoop中
  
  std::shared_ptr<EventLoopThreadPool> threadPool_;
  //事件驱动线程池,池中每个线程运行一个EventLoop 
  
  ConnectionCallback connectionCallback_;
  //用户传入,有tcp连接到达或tcp连接关闭时调用,传给TcpConnection 
  
  MessageCallback messageCallback_;
  //用户传入,对端发来消息时调用,传给TcpConnection
  
  WriteCompleteCallback writeCompleteCallback_;
  //成功写入内核tcp缓冲区后调用,传给TcpConnection
  
  ThreadInitCallback threadInitCallback_;
  //线程池初始化完成后调用,传给EventLoopThreadPool,再传给每个EventLoopThread
  
  AtomicInt32 started_;
  // always in loop thread
  int nextConnId_;//TcpConnection特有id,每增加一个TcpConnection,nextConnId_加一 
  
  ConnectionMap connections_;//所有的TcpConnection对象,智能指针
};
  • 事件驱动循环EventLoop如上所说,运行在主线程,只用来监听客户端连接请求(Acceptor),不负责监听TcpConnection
  • 事件驱动循环线程池EventLoopThreadPool用于分发线程,当新建TcpConnection时,从线程池中选出一个事件驱动循环线程负责这个TcpConnection
  • connections_std::map<string, shared_ptr<TcpConnection> >类型,在新建TcpConnection后会添加到这个map中,可以保证每个TcpConnection在添加后引用计数为1,保证生命期的正常管理。在tcp连接关闭后会从map中删除TcpConnection,使引用计数减1,为了防止引用计数为0导致没有从TcpConnection的函数中返回就已经将TcpConnection销毁,在removeConnectionInLoop中使用std::bind延长了TcpConnection的生命期,
    ⭐⭐⭐
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

muduo net库学习笔记7——用于创建服务器的类TcpServer 的相关文章

  • 弗洛伊德算法(floyd)

    弗洛伊德算法和迪杰斯特拉算法都是求两点之间最短路径的问题 弗洛伊德算法使用了动态规划的思想 用二维矩阵记录了所有点之间最短的距离 虽然代码只有几行 但是思想还很值得回味的 其主要的思想就是两个点之间的直接距离能否使用第三个点来缩短 公式 v
  • 看过来——用Python探索《红楼梦》的人物关系

    数据准备 红楼梦 txt 文件一份 金陵十二钗 贾宝玉 人物名称列表 宝玉 nr 黛玉 nr 宝钗 nr 湘云 nr 凤姐 nr 李纨 nr 元春 nr 迎春 nr 探春 nr 惜春 nr 妙玉 nr 巧姐 nr 秦氏 nr 该分列表是为了
  • SpringBoot Admin服务离线、不显示健康信息的问题

    SpringBoot Admin服务离线 不显示健康信息的问题 问题1 SpringBoot Admin服务一直离线 原因 解决方法 重启电脑 重新加载配置文件 问题2 数据显示不全 解决方法 问题1 SpringBoot Admin服务一
  • 进程篇----获取进程句柄(提权、打开)OpenProcess

    对目标进程提权 然后打开 提权的目的是为了防止当前进程的权限无法打开目标进程 获取句柄 BOOL EnableDebugPrivilege TRUE 代表需要提权 BOOL EnableDebugPrivilege FALSE 代表不需提权
  • Python:统计子矩阵(前缀和、尺取法)

    问题描述 给定一个 N M 的矩阵 A 请你统计有多少个子矩阵 最小 1 1 最大 N M 满足子矩阵中所有数的和不超过给定的整数 K 输入格式 第一行包含三个整数 N M 和 K 之后 N 行每行包含 M 个整数 代表矩阵 A 输出格式
  • arduino python scratch_arduino怎么和scratch用

    展开全部 arduino可以和scratch在一起使用62616964757a686964616fe58685e5aeb931333433633365 但环节比较复杂 每个环节都需要注意 具体方法如下 1 由于scratch软件和ardui
  • SpringBoot Bean指定初始化顺序详解

    最近遇到SpringBoot容器外类初始化依赖容器内bean的问题 由于容器内bean初始化有一定顺序 网上查了查资料 这里记录一下 0 前言 本文将介绍几种可行的方式来控制 bean 之间的加载顺序 Order指明顺序 AutoConfi
  • 计算机操作系统的最基本特性,操作系统有哪几大特征?其最基本的特征是什么?...

    操作系统有哪几大特征 其最基本的特征是什么 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 操作系统有哪几大特征 其最基本的特征是什么 操作系统的基本特征 1 并
  • Java串口包Javax.comm的安装

    安装个java的串口包安装了半天 一直找不到串口 现在终于搞定了 做个记录 因为是windows下开发 去下载 http mdubuc freeshell org Jolt javacomm20 win32 zip 完整的2 0版本 还有e
  • visual studio 2008 试用版评估期已结束的解决方法

    在 控制面板 中启动 添加删除程序 选中Vs2008 点击 更改 删除 输入序列号 PYHYP WXB3B B2CCM V9DX9 VDY8T

随机推荐

  • 深入ZooKeeper——ZooKeeper原语和架构

    ZooKeeper基础 设计一个用于协作需求的服务的方法往往是 提供原语列表 暴露出每个原语的实例化调用方法 并直接控制这些实例 这种设计存在一些重大的缺陷 首先 我们要么预先提出一份详尽的原语列表 要么提供API的扩展 以便引入新的原语
  • 输出斐波那契数列前n项以及前n项和

    首先介绍一下斐波那契数列 1 1 2 3 5 8 13 21 34 55 在数学上 斐波那契数列以递推的方法定义 F 0 0 F 1 1 F n F n 1 F n 2 n 2 n N 代码的实现 斐波那契数列 int fibonacci
  • Koa笔记 01:基础入门

    文章目录 目的 基础介绍 Koa Context Request Response 错误处理 总结 目的 Node js最基本的是用来搭建HTTP服务器使用 它内置的模块基本上可以满足基础的HTTP服务器功能 但是如果要实现比较完整的HTT
  • pinyin4j 常见用法

    1 简单介绍 有时候 需要将汉字编程对应的拼音 以方便数据的处理 比如在Android手机应用的开发上 要查询联系人的姓名 通常都是用拼音进行查询的 比如要查询 曹孟德 就可以输入 cmd 即 曹孟德 三个汉字的拼音 caomengde 各
  • 两种方式修改jar内配置文件(1 解压jar,修改并重新打包;2 直接修改jar内指定配置文件)

    参考 修改jar包中的配置文件 木头房子的的博客 CSDN博客 一 jar工具直接修改包内文件 1 列出jar包中的所有目录及目录下文件 找到需要修改的文件并复制路径 如果知道文件具体位置 则跳过此步 列出jar下所有目录及目录下文件 ja
  • 什么是预热 压测_换个角度,聊聊全链路压测

    前言 之前自己也写过好几篇关于全链路压测的文章或者博客 最近看了infoQ上infoQ 数列科技杨德华的专栏 复盘了下自己以往在全链路压测实施方面的工作 发觉还有很多可以做的更好的地方 就以这篇文章来做个总结 顺带说说我自己实施全链路压测工
  • python+word+excel+ppt自动化办公教程_python自动化办公——excel操作

    1 打开工作表 excel表操作 from openpyxl import load workbook workbook load workbook 11 xlsx print workbook sheetnames excel表操作 fr
  • C#学习笔记一:C#开发环境的设置

    C 是 NET Framework的一部分 用于编写 NET应用程序 C 集成开发环境 IDE 微软提供了以下C 编程开发工具 Visual Studio 2010 VS Visual C 2010 Express VCE Visual W
  • 数字化的终局:赛博朋克?社会主义?

    数字化的终局 赛博朋克 社会主义 数字化的浪潮席卷而来 无论我们愿不愿意 都已经事实上被裹挟 在这场风暴中人类活动的数据被搜集 分析 然后反过来影响人类的行为 就如同 外卖骑手 困在系统里 中所描述的那样 外卖 是如此经典的一个场景 能让我
  • C++ STL set:erase()、clear()、find()、insert()方法

    一 erase 方法 如图所示 include
  • PCL 泊松曲面重建法(多线程加速版)

    目录 一 算法原理 1 算法概述 2 主要函数 二 代码实现 三 结果展示 一 算法原理 1 算法概述 PCL中常用的泊松曲面重建法由于运算复杂度高 算法效率低 在实际应用中受到较大的限制 为了改变这一现状 PCL1 13 0版本中对该算法
  • docker的安装(yum/rpm/二进制/shell/)

    1 yum安装 官方推荐 参考以下文档安装即可 https docs docker com engine install centos https mirrors tuna tsinghua edu cn help docker ce 2
  • PyQty5—第三课:按钮与函数绑定(2)(附完整代码)

    在上一节课中 我们已经学会了将按钮与函数进行绑定 从而自己可以对函数进行扩展 那么今天我们将会学习另一个方法将按钮与函数进行绑定 上一节课的复习链接 点我 gt PyQty5 第二课 首相我们把上一节课的代码中的绑定函数以及对象注释掉 代码
  • win10关闭自动屏保

    https blog csdn net u010560236 article details 108462946 1 桌面空白处点击鼠标右键 显示设置 电源和睡眠 如下都设置了 从不 然而不起作用 还是会自动锁屏 2 桌面空白处点击鼠标右键
  • java调用dll

    本文转自 http www blog edu cn user4 jjj250 archives 2007 1722308 shtml Jawin Java Win32 是一个免费的 开放源代码的体系结构 用于 Java 组件和通过 Wind
  • eclipse中java代码在控制台输出的中文内容是乱码怎么解决

    eclipse中创建了一个maven工程 用System out在控制台输出内容 但中文内容显示乱码 解决方法 右键单击工程 选择Run As gt Run Configurations 点击Common这个tab页 Encoding选择U
  • 谷歌浏览器如何启用java小脚本_各种浏览器开启JavaScript脚本方法

    随着网站设计技术的发展 为了用户友好体验 大部分网站使用了JavaScript脚本设计 如果您的浏览器禁用或关闭的JavaScript支持 那么可能造成网站体验差或网站部分功能无法使用 下面提供10种浏览器如何开启JavaScript的方法
  • python整数位数能无限大么_在计算机中,整数不能无限大。为什么呢?

    非常感谢邀请 就我个人的浅薄知识回答一下题主的疑问 先简单地回答题主的问题 我猜测题主可能是在学习了C语言之后对 int 类型变量的数值表示范围有限制而产生的疑问 就我的理解 整数不能无限大有两个原因 受限于机器字长与机器中的整数表示方式
  • 2015/4/28总结--git编辑文件---sts创建动态工程

    1 在git 中创建并编辑文件的命令如下 cd touch test txt vi touch test txt 编辑完成时先按Esc退出键 再输入 wq即可保存并退出编辑 2 在spring Tool Suite中创建动态的web 工程
  • muduo net库学习笔记7——用于创建服务器的类TcpServer

    muduo为每个EventLoop设计了runInLoop和queueInLoop函数用来将本该在其他线程执行的线程不安全函数放到它所属线程执行 从而达到线程安全 muduo采用采用one loop per thread的设计思想 即每个线