【muduo源码分析】「阻塞」「非阻塞」「同步」「异步」

文章目录
- 引言
- 何为「muduo库」
- 安装muduo库
- 阻塞、非阻塞、同步、异步
- 数据准备
- 数据准备
 
 
引言
从本篇博客开始,我会陆续发表muduo库源码分析的相关文章。感谢大家的持续关注!!
何为「muduo库」
muduo库是 陈硕 大神个人开发的 C++ 的 TCP 网络编程库。muduo 基于 Reactor 模式实现,Reactor 模式也是目前大多数 Linux 端高性能网络编程框架和网络应用所选择的主要架构,例如 Redis 和 Java 的 Netty 库等。
注意:目前muduo库仅可以在Linux环境下使用,因为:陈硕大师在写muduo库时,不考虑可意志性,不跨平台,只支持Linux,不支持windows。
安装muduo库
这里我贴一篇安装muduo库的详细教程:muduo库的安装和使用
为了让大家了解muduo库使用起来是如何的方便,我写一段示例代码,用不到20行的代码量快速构建一个Linux环境下的TCP服务器
#include<muduo/net/TcpServer.h>
#include<muduo/net/EventLoop.h>
#include<iostream>
using namespace muduo;
using namespace muduo::net;
using namespace std;
void onMessage(const TcpConnectionPtr &conn,Buffer *buf,Timestamp time)
{conn->send(buf);
}
int main()
{EventLoop Loop;InetAddress listenAddr("127.0.0.1",6000);TcpServer server(&Loop,listenAddr,"chatServer");server.setMessageCallback(onMessage);server.start();Loop.loop();
}
我们可以用telnet充当客户端,连接服务器,进行通信,这段代码的效果是:服务器将客户端发来的数据再发送给客户端。
如果我们使用网络通信AP创建套接字,然后通信的话,代码量肯定远不止20行,所以这就是使用网络库封装的函数的显著效果。可能大家看这段代码会一脸懵。别担心,我刚一开始接触这个库的时候也是如此,当我们认真学习了muduo库,我们不禁会发现:陈硕大神设计的太妙了。
阻塞、非阻塞、同步、异步
一个典型的IO过程分为哪两个阶段?
数据准备和数据读取
数据准备
根据系统IO操作的就绪状态,分为:
-  阻塞状态 
-  非阻塞状态 
大家都使用过recv这个系统API接口。这个接口默认就是阻塞式读取数据。那么阻塞式等待数据就绪时是什么表现呢?
当数据没有准备好时,recv会阻塞式等待,造成该线程什么也做不了,就造成了线程阻塞。
但是我们可以通过系统接口将一个文件描述符设置为非阻塞状态「由于这不是本篇博客的重点,这里就不再详细介绍这个过程了」那么非阻塞等待数据就绪有什么表现呢?
1.当数据没有准备好时,recv会返回-1,同时将error设置为 EAGAIN 「表示数据还没有准备就绪,但没有发生错误」
2.当读取操作发生错误时,读取失败,recv返回0.
3.当读取成功时,返回读取数据的数量「字节数」。
数据准备
根据应用程序和内核的交互方式,分为:
-  同步 
-  异步 
对于同步读取数据而言,代表函数就是recv。当数据读取时,线程阻塞等待,消耗的时间属于应用程序。然后将数据从内核缓冲区搬到应用程序的缓冲区
对于异步读取数据时,我们关系的是将数据从操作系统内核缓冲区搬到应用层缓冲区,于是就将这一需求告诉操作系统,让操作系统完成这件事情,等到完成之后,再让其用我们注册的通知函数,通知应用程序,此时读取数据花费的时间就不属于应用程序,而属于操作系统了,在操作系统读取数据期间,应用程序线程可以做其他事情,等到数据读取完毕,应用程序只负责对数据进行处理就可以了。
Tips:异步通知中,我们通常使用回调函数的方式进行通知
相关文章:
 
【muduo源码分析】「阻塞」「非阻塞」「同步」「异步」
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言何为「muduo库」安装muduo库阻塞、非阻塞、同步、异步数据准备数据准备 引言 从本篇博客开始,我会陆续发表muduo库源码分析的相关文章。感谢大家的持续关注!!…...
 
顶顶通呼叫中心中间件-机器人话术挂机后是否处理完成事件
前言 问题:机器人放音的过程中,如果用户直接挂机就会继续匹配下一个流程,如果匹配上的是放音节点,还会进行放音,那么在数据库表中就会多出一条放音记录。 解决方法 一、话术添加一个全局挂机节点 需要在话术中添加一…...
Springboot Mybatis 动态SQL
动态SQL <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.wzb.SqlImprove2024…...
 
ORM的了解
什么是ORM?为什么要用ORM?-CSDN博客 C高级编程(99)面向资源的设计思想(ORM)_c orm-CSDN博客 ORM:Object-Relational-Mapping 对象关系映射 -------------------------- 我想对数据库中的表A进行增删改…...
 
关于大模型的10个思考
9月28日,第四届“青年科学家50论坛”在南方科技大学举行,美国国家工程院外籍院士沈向洋做了《通用人工智能时代,我们应该怎样思考大模型》的主题演讲,并给出了他对大模型的10个思考。 以下是他10个思考的具体内容: 1…...
CFR( Java 反编译器)---> lambda 表达式底层实现机制
一、安装教程 CFR(Class File Reader)是一个流行的Java反编译器,它可以将编译后的.class文件或整个.jar文件转换回Java源代码。以下是CFR的下载和使用教程: 下载CFR 访问CFR的官方网站或GitHub仓库:CFR的最新版本和所…...
《C++多态性:开启实际项目高效编程之门》
在 C的广阔编程世界中,多态性是一个强大而富有魅力的特性。它为程序员提供了极大的灵活性和可扩展性,使得代码能够更加优雅地应对复杂的业务需求。在实际项目中,理解和正确应用 C的多态性至关重要,它可以显著提高代码的质量、可维…...
UDS_5_输入输出控制功能单元
目录 一. 0x2F服务 一. 0x2F服务 InputOutputControlByIdentifier(0x2F)服务 用于替换服务器输入信号的值或内部功能控制电子系统的某个输出(执行器) •请求报文 A_Data Byte Parameter Name Cvt Byte Value #1 InputOutputControlByIdentifier Request SID M 0x2F dataI…...
CAD快捷键
CAD快捷键 功能快捷键描述直线L点PO多段线PL多用于描边构造线XL无限长直线射线RAY样条曲线SPL绘制光滑曲线–––圆弧A圆C矩形REC正多边形POL–––填充H圆角F倒角CHA–––打断BR分解X合并J–––创建块B插入块I 功能快捷键描述移动M复制CO擦除E修剪TR延伸EX拉伸S镜像MI偏移…...
 
Spring6梳理12——依赖注入之注入Map集合类型属性
以上笔记来源: 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)https://www.bilibili.com/video/BV1kR4y1b7Qc 12 依赖注入之注入Map集合类型属性 12.1 创建Student类和Teacher类 Student类中创建了run…...
 
基于SpringBoot校园失物招领系统设计与实现
文未可获取一份本项目的java源码和数据库参考。 本课题的作用、意义,在国内外的研究现状和发展趋势,尚待研究的问题 作用:本课题的目的是使失物招领信息管理清晰化,透明化,便于操作,易于管理。通过功能模…...
 
推荐4款2024年热门的PDF转ppt工具
有时候,我们为了方便,需要将PDF里面的内容直接转换的PPT的格式,既方便自己演示和讲解,也让我们可以更加灵活的进行文件的编辑和修改。如果大家不知道要如何进行操作的话,我可以为大家推荐几个比窘方便实用的PDF转换工具…...
 
[深度学习]卷积神经网络CNN
1 图像基础知识 import numpy as np import matplotlib.pyplot as plt # 图像数据 #imgnp.zeros((200,200,3)) imgnp.full((200,200,3),255) # 可视化 plt.imshow(img) plt.show() # 图像读取 imgplt.imread(img.jpg) plt.imshow(img) plt.show() 2 CNN概述 卷积层convrelu池…...
 
从零开始,Docker进阶之路(三):Docker镜像与命令
一、Docker核心名词 镜像文件、容器、仓库 镜像:简单理解为就是一个安装包,里面包含容器所需要运行的基础文件和配置信息,比如:redis镜像、mysql镜像等。 镜像的来源方式: 1.自己做镜像,比如自己开发微服…...
 
【计算机网络】网络层详解
文章目录 一、引言二、IP 基础知识1、IP 地址2、路由3、IP报文4、IP报文的分片与重组 三、IP 属于面向无连接型四、IP协议相关技术1、DNS2、ICMP3、NAT技术4、DHCP 一、引言 TCP/IP的心脏是网络层。这一层主要由 IP 和 ICMP 两个协议组成。网络层的主要作用是“实现终端节点之…...
后端开发刷题 | 最小的K个数(优先队列)
描述 给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。 数据范围:0≤k,n≤10000,数组中每个数的大小0≤val≤1000 要…...
 
【JavaEE】——阻塞队列,生产消费者模型(较难)
阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你! 目录 一:阻塞队列 1:概念 2:阻塞队列与普通队列比较 二:“生…...
 
makefile和CMakeLists/C++包管理器
make 大家可能会很奇怪,都什么年代了,还学makefile,cmake都有些过时了,为什么还要再学这个呢? 我是这么看待这个问题的,cmake跨平台性还是很有有优势的,有着多年积累的底蕴,借助大模…...
 
STM32 通过软件模拟 I2C 驱动 24Cxx 系列存储器
目录 一、AT24CXXX 系列存储器介绍1、基本信息2、寻址方式3、页地址与页内单元地址4、I2C 地址5、AT24CXX 的数据读写5.1 写操作5.1.1 按字节写5.1.2 按页写 5.2 读操作5.2.1 当前地址读取5.2.2 随机地址读取5.2.3 顺序读取 二、代码实现1、ctl_i2c2、at24c3、测试程序 I2C 相关…...
 
Go语言匿名字段使用与注意事项
1. 定义 Go语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段,称之为匿名字段或者嵌套字段。 所谓匿名字段实际上是一种结构体嵌套的方式,所以也可以称作嵌套字段。 这种方式可以实现组合复用,即通过匿名字段,结构体…...
 
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
 
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
 
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
 
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
 
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...
 
SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...
