muduo库的思路梳理

前言

对于muduo库源码的剖析我发现还是有些混乱的,所以这里再次梳理一下muduo网络库争取可以简单明了

首先对于muduo库来说,不能想的得太过于复杂,它无非就是一个线程池加上epoll组成的网络库

这里我们从用的角度出发理解muoduo网络库

#include <string>#include <mymuduo/TcpServer.h>
#include <mymuduo/Logger.h>class EchoServer
{
public:EchoServer(EventLoop *loop, const InetAddress &addr, const std::string &name): server_(loop, addr, name), loop_(loop){// 注册回调函数 将用户定义的连接事件处理函数注册进TcpServer中,TcpServer发生连接事件时会执行onConnection函数。server_.setConnectionCallback(std::bind(&EchoServer::onConnection, this, std::placeholders::_1));//将用户定义的可读事件处理函数注册进TcpServer中,TcpServer发生可读事件时会执行onMessage函数。server_.setMessageCallback(std::bind(&EchoServer::onMessage, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));// 设置合适的subloop线程数量 你这里设置为3,就和概述篇图中的EventLoop2 EventLoop3 EventLoop4对应,有三个sub EventLoopserver_.setThreadNum(3);}void start(){server_.start();}private:// 连接建立或断开的回调函数void onConnection(const TcpConnectionPtr &conn)   {if (conn->connected()){LOG_INFO("Connection UP : %s", conn->peerAddress().toIpPort().c_str());}else{LOG_INFO("Connection DOWN : %s", conn->peerAddress().toIpPort().c_str());}}// 可读写事件回调void onMessage(const TcpConnectionPtr &conn, Buffer *buf, Timestamp time){std::string msg = buf->retrieveAllAsString();conn->send(msg);conn->shutdown();   // 关闭写端 底层响应EPOLLHUP => 执行closeCallback_}EventLoop *loop_;TcpServer server_;
};int main() {EventLoop loop;InetAddress addr(8002, "192.168.194.130"); //InetAddress其实是对socket编程中的sockaddr_in进行封装,使其变为更友好简单的接口而已EchoServer server(&loop, addr, "EchoServer");server.start(); //启动TcpServer服务器loop.loop(); //执行EventLoop::loop()函数,这个函数在概述篇的EventLoop小节有提及return 0;
}

直接看main函数,TcpServer对象先创建出来,也就是代码中的server

这里是它的构造函数,也就是说我们构建的TcpServer对象先创建了一个 Acceptor对象和一个线程池对象

对于Acceptor对象来说

创建了一个Channel,同时创建一个非阻塞的套接字fd给这个acceptChannel_

同时也绑定了Acceptor的回调函数,当改fd上有事发生的时候会调用这个handleRead进行相应的处理

这里就结束了,然后是线程池的创建,这个没什么好说的,就是创建线程以及相对于的轮询算法的方法

再看到开始的使用代码,接下来就是Server.start

这里主要是线程池对象开始,这里会选择一个线程,很明显现在只有主线程的epoll运行,所有这里的loop_是mainLoop,接着调用runinLoop,然后会执行Acceptord::lisetn

这个函数就是去监听有没有读事件触发,同时把Channel注册到mainloop的epoll里面去,如果有事件发生那么就会调用Channel注册的回调函数,这个回调函数会调用Acceptor的handleRead

调用这个之后会拿到事件的fd,并且嗲用newConnectionCallback_这个函数,这个函数是它的上层注册的,也就是TcpServer,注册的一个回调函数

 所有进入到newConnection里面去

这个函数的主要目的就是把回调函数注册进Channel,并且把传进来的fd也给Channel,然后通过weakFd通知子loop的线程苏醒,这里线程池会通过轮询的方式把这个连接给到相应的线程里面去,这样也就实现了一个线程一个loop

给到子loop,子loop同样会去事件循环监听事件fd有没有事件发生,从而调用相应的回调函数(这这里的回调是用户给予的)

这里有一张流程图给予理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Keil5 安装全攻略

Keil5 安装全攻略 Keil5 是一款广泛用于嵌入式开发的 IDE&#xff0c;支持多种微控制器架构&#xff08;如 ARM、C51&#xff09;。本文将详细介绍 Keil5 的安装步骤、常见问题及解决方法&#xff0c;帮助您快速上手。 1. 安装前的准备工作 (1) 系统要求 操作系统&#xff1…

C语言do...while语句将数字反转后输出

一、题目引入 输入一个数字,将各位数字反转后输出? 参考代码: 二、分析代码 接着图片中的分析 第一 ->a 的值变为12 第二 ->进入while循环条件,a为12不等于0循环才停止(a的值为12,显然不等于0) 所以继续进行循环 第三 ->此时b的值为12取各位上的数字(即2) 打印…

优选算法系列(前缀和 _下) k

目录 五&#xff1a;和为 k 的子数组&#xff08;medium&#xff09; 题目链接&#xff1a;560. 和为 K 的子数组 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 代码&#xff1a; 六&#xff1a;和可被 K 整除的子数组&#xff08;medium&#xff09; 题目链…

mac m3 pro 部署 stable diffusion webui

什么是Stable Diffusion WebUI &#xff1f; Stable Diffusion WebUI 是一个基于Stable Diffusion模型开发的图形用户界面&#xff08;GUI&#xff09;工具。通过这个工具&#xff0c;我们可以很方便的基于提示词&#xff0c;描述一段文本来指导模型生成相应的图像。相比较通过…

OpenCV图像拼接(6)根据权重图对源图像进行归一化处理函数normalizeUsingWeightMap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::normalizeUsingWeightMap 是 OpenCV 中用于图像拼接细节处理的一个函数。它根据权重图对源图像进行归一化处理&#xff0c;通常用于…

23种设计模式-外观(Facade)设计模式

外观设计模式 &#x1f6a9;什么是外观设计模式&#xff1f;&#x1f6a9;外观设计模式的特点&#x1f6a9;外观设计模式的结构&#x1f6a9;外观设计模式的优缺点&#x1f6a9;外观设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是外观设计模式…

capl语言基础语法(二)

1.strncpy&#xff1a;将字符串复制到另一个字符串中。 输入&#xff1a; dest 是目标字符串。 src 是源字符串。 n 是要复制的最大字符数。 语法&#xff1a; char *strncpy(char *dest, const char *src, size_t n); 例子&#xff1a; strncpy(gStringRep,"",…

QLoRA和LoRA 微调

QLoRA 其实是一种结合了量化和 LoRA 微调技术的统一方法&#xff0c;而不是同时使用两种不同的微调方式。换句话说&#xff0c;QLoRA 的意思就是&#xff1a;先把大模型的主权重用低精度&#xff08;例如 4-bit&#xff09;量化&#xff0c;从而大幅减少存储需求&#xff1b;然…

Qt Concurrent 并发 Map 和 Map-Reduce

并发 Map 和 Map-Reduce QtConcurrent::map()会对容器中的每个项目应用一个函数&#xff0c;对项目进行就地修改。QtConcurrent::mapped() 类似于 map()&#xff0c;但它返回的是一个包含修改内容的新容器。QtConcurrent::mappedReduced() 类似于 mapped()&#xff0c;只不过修…

RT-Thread-线程管理

一、线程管理 RT_Thread线程管理主要是实现线程管理和调度&#xff0c;线程分为用户线程和系统线程。RT_Thread的线程调度器是抢占式的&#xff0c;寻找就绪状态最高优先级线程。 线程管理的API函数 创建线程函数 rt_thread_t rt_thread_create( const char *name, //线程名称 …

【CC2530 教程 十二】CC2530 Z-Stack 硬件抽象层

目录 一、硬件抽象层简介&#xff1a; &#xff08;1&#xff09;HAL 硬件抽象层是什么&#xff1f; &#xff08;2&#xff09;通俗易懂的解释&#xff1a; &#xff08;3&#xff09;具体例子&#xff1a; 二、硬件抽象层HAL&#xff1a; &#xff08;1&#xff09;HAL…

Linux如何判断磁盘是否已分区?

在 Linux 系统中&#xff0c;判断磁盘是否已分区可通过以下方法实现&#xff1a; 方法 1&#xff1a;使用 fdisk -l 命令 此命令会列出所有磁盘及其分区的详细信息&#xff1a; sudo fdisk -l输出解读&#xff1a; 若磁盘&#xff08;如 /dev/sdb&#xff09;下有类似 /dev/…

《熔化焊接与热切割作业》考试注意事项

考试前的准备 携带必要的证件和材料&#xff1a;考生需携带身份证、准考证等有效证件&#xff0c;以及考试所需的焊接工具、材料等。确保证件齐全&#xff0c;避免因证件问题影响考试。 提前检查焊接设备和工具&#xff1a;在考试前&#xff0c;考生应仔细检查焊接设备和工具是…

Matlab Hessian矩阵计算(LoG算子)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 图像的Hessian矩阵用于描述图像灰度值的二阶导数,可以用来分析图像的局部曲率和变化。例如,在图像边缘检测、特征点检测等任务中,Hessian矩阵能帮助我们识别图像的结构。 Hessian矩阵定义 对于二维图像,Hessian…

selenium之处理弹框(alert、confirm、prompt)

弹框 WebDriver提供了一个API, 用于处理JavaScript提供的三种类型的原生弹窗消息. 这些弹窗由浏览器提供限定的样式.&#xff1b;分别为以下三种 alerts警告框confirm确认框prompt提示框 话不多说&#xff0c;开始实践下就知道怎么一回事了 alerts 警告框&#xff0c;显示…

Visual Studio 2019 Qt QML 项目环境搭建常见问题处理方法

在 Visual Studio 2019 运行 Qt/QML 项目比直接使用QtCreator环境麻烦&#xff0c;主要是有qmake 的一些配置项不能在 Visual Studio中设置。下面整理一些常见问题的处理方法&#xff0c;供参考&#xff1a; 搭建VS Qt 环境&#xff0c;在Visual Studios 2019下面安装 Qt Vis…

【Linux】POSIX信号量与基于环形队列的生产消费者模型

目录 一、POSIX信号量&#xff1a; 接口&#xff1a; 二、基于环形队列的生产消费者模型 环形队列&#xff1a; 单生产单消费实现代码&#xff1a; RingQueue.hpp&#xff1a; main.cc&#xff1a; 多生产多消费实现代码&#xff1a; RingQueue.hpp&#xff1a; main.…

RAG优化:python从零实现GraphRag 一场文档与知识的“恋爱”之旅

嘿,亲爱的算法工程师们,准备好迎接一场文档与知识的“恋爱”之旅了吗?今天我们要介绍的 Graph RAG,就像是一位“红娘”,帮助文档和知识在图的世界里找到彼此,擦出智慧的火花! 文章目录 为什么需要 Graph RAG?Graph RAG 的“恋爱秘籍”准备好了吗?让我们开始吧!环境设…

深入 SVG:矢量图形、滤镜与动态交互开发指南

1.SVG 详细介绍 SVG&#xff08;Scalable Vector Graphics&#xff09; 是一种基于 XML 的矢量图形格式&#xff0c;用于描述二维图形。 1. 命名空间 (Namespace) ★ 了解 命名空间 URI&#xff1a;http://www.w3.org/2000/svg 用途&#xff1a;在 XML 或 XHTML 中区分不同标…

HTTPS 加密过程详解

HTTPS 的核心组成是 HTTP 协议与 SSL/TLS 加密层的结合&#xff0c;通过加密传输、身份验证和完整性校验机制&#xff0c;确保数据安全。其加密过程通过以下方式保障数据的机密性、完整性和身份验证&#xff1a; 一、HTTPS 的核心组成 1. HTTP 协议 作为基础通信协议&#xf…