首页
Python
Java
前端
数据库
Linux
Chatgpt专题
开发者工具箱
muduo专题
muduo 日志打印改造
改造前是这样的: 改造后是这样的: 时间戳改成本地的了,线程id 改成了[线程id],函数名称放到最后。看一下这个打印日志宏: #define LOG_TRACE if (muduo::Logger::logLevel() <= muduo::Logger::TRACE) \ muduo::Logger(__FILE__, __LINE__, muduo::Logger::
阅读更多...
仿Muduo库实现高并发服务器——Acceptor模块
Acceptor模块是为了创建套接字,并且接收新到来的客户端套接字,将对应套接字的Channel对象添加到Poller对象中,进行事件监控。 Acceptor模块成员函数: 连接回调函数: 在构造函数这里,就对主线程上面的网络套接字进行回调函数的设置。 会在TcpServer模块中,启动该套接字读事件监控,并将对应的Channel对象添加到Poller对象中。
阅读更多...
muduo的研究目录
目录(1)大并发服务器架构介绍(P3)poll:poll函数原型(P4)poll:poll使用的基本流程 ,EMFILE处理 ,cmake(P5)epoll:epoll ,epoll LT ,epoll ET(P6)epoll:epoll的两种触发模式,select/poll/epoll对比(7)muduo介绍,参考:链接(8)面向对象编程(9)基于对象的编程风格(10)muduo_base库源码
阅读更多...
(13)muduo_base库源码分析:Thread类实现
文章目录 1.线程标识符2.Thread类图3.Thread类相关代码学习4.相关测试5.多线程多进程的死锁案例 1.线程标识符 Linux中,每个进程有一个pid,类型pid_t,由getpid()取得。Linux下的POSIX线程也有一个id,类型 pthread_t,由pthread_self()取得,该id由线程库维护,其id空间是各个进程独立的(即不同进程中的线程可能
阅读更多...
(12)muduo_base库源码分析:Exception类实现
文章目录 1.Exception类实现2.测试 1.Exception类实现 类图 12\jmuduo\muduo\base\Exception.cc // Use of this source code is governed by a BSD-style license// that can be found in the License file.//// Aut
阅读更多...
(P20)muduo_base库源码分析:日志作用,日志级别,Logger使用时序图
文章目录 1.日志作用2.日志级别3.Logger使用时序图 1.日志作用 开发过程中: 调试错误 更好的理解程序 运行过程中: 诊断系统故障并处理 记录系统运行状态 错误分为:编译,运行(可以把errno对应的错误文本信息记录到日志中),逻辑错误(将整个程序的运行状态输出到日志中,通过分析日志可以理清楚程序逻辑,从而找出逻辑错误) 2.日志级别 TRACE 指出
阅读更多...
(P19)muduo_base库源码分析:ThreadLocalSingleton封装
文章目录 1.ThreadLocalSingleton封装 1.ThreadLocalSingleton封装 类图如下: 该方法比P18的方法更好 线程本地单例类封装,每个线程都有一个T类型的单例对象 eg:src\19\jmuduo\muduo\base\ThreadLocalSingleton.h eg测试:src\19\jmuduo\muduo\base\te
阅读更多...
(P18)muduo_base库源码分析:线程特定数据,ThreadLocal类的封装
文章目录 1.线程特定数据2.ThreadLocal类的封装 1.线程特定数据 在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据。 在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。 但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问。 POSIX线程库通过维护一定的数据结构来解决这个问题,
阅读更多...
(P17)muduo_base库源码分析:线程安全Singleton类实现
文章目录 1.线程安全Singleton类实现 1.线程安全Singleton类实现 线程安全Singleton类实现 pthread_once atexit typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1]; 类图 +号表示公有的,-号表示私有的。使用模板方式实现 eg:src\17\jmudu
阅读更多...
(P16)muduo_base库源码分析:ThreadPool实现
文章目录 1.ThreadPool实现 1.ThreadPool实现 也是生产者消费者问题。 ThreadPool创建了若干线程,维护了一个线程队列; 这些线程是用来执行任务的,所以还维护了一个任务队列; 外部的生产者线程往ThreadPool中的任务队列添加任务,一旦任务队列有任务,则唤醒线程队列的线程来执行这些任务,这些线程相当于消费者线程; eg:src\16\jm
阅读更多...
(P15)muduo_base库源码分析:BlockinngQueue(无界阻塞队列),BoundedBlockingQueue(有界阻塞队列)
文章目录 1.BlockinngQueue(无界阻塞队列)2.BoundedBlockingQueue(有界阻塞队列) 1.BlockinngQueue(无界阻塞队列) BlockinngQueue代表无界队列,BoundedBlockingQueue代表有界队列,因为有界队列多了:一个需要判断队列是否为满的条件和一个NotFull的条件变量 为了保证生产者线程和消费者线程安
阅读更多...
【C++集群聊天服务器(一)】|Linux平台资源受限下boost库和muduo网络库源码编译安装
本人使用的服务器是2G2核 ubuntu22.04 前置工作 muduo库源码github仓库地址: muduo WIndows和Linux平台的boost源码包下载(zip是Windows版,tar.gz是Linux版,你也可以去boost官网下载最新版本) Boost C++ Libraries 由于muduo网络库是基于boost的,所以我们需要先编译Boost。 Linux
阅读更多...
004 仿muduo实现高性能服务器组件_Buffer模块与Socket模块的实现
🌈个人主页:Fan_558 🔥 系列专栏:仿muduo 🌹关注我💪🏻带你学更多知识 文章目录 前言Buffer模块Socket模块 小结 前言 这章将会向你介绍仿muduo高性能服务器组件的buffer模块与socket模块的实现 Buffer模块 设计思想 实现思想: 1、实现缓冲区得有一块内存空间,采用vector,string字符串的操作遇到
阅读更多...
002 仿muduo库实现高性能服务器组件_整体框架
🌈个人主页:Fan_558 🔥 系列专栏:仿muduo 🌹关注我💪🏻带你学更多知识 文章目录 前言项目框架小结 前言 本文不会包含任何项目模块的代码,旨在向你介绍项目具体分为哪几个模块,考虑到还没有涉及任何模块的学习,因此本文主要是为了让你写此项目的时候有一个初步印象,所以本文也不会涉及对各个模块深度剖析 项目框架 功能模块划分: 基于以上的理解,我们要实
阅读更多...
001 仿muduo库实现高性能服务器组件_项目简介
🌈个人主页:Fan_558 🔥 系列专栏:仿muduo 🌹关注我💪🏻带你学更多知识 文章目录 一、项目简介二、所需知识储备三、什么是muduo四、Reactor模式单Reactor单线程:单I/O多路复⽤+业务处理单Reactor多线程:单I/O多路复⽤+线程池(业务处理)多Reactor多线程:多I/O多路复⽤+线程池(业务处理) 一、项目简介 我们知道
阅读更多...
【Muduo】TcpConnection类
Muduo网络库的TcpConnection类代表了TCP连接的一端,即服务器与远程对等端之间的连接。TcpConnection类知道自身和对端的InetAddress、封装了前面讲过的Socket类和Channel类,并且保有管理自己的subLoop指针,还有多种事件处理函数和回调,还有属于自己的接收Buffer/发送Buffer。为上层应用提供了简洁的接口来处理连接的生命周期和数据传输。 主
阅读更多...
【Muduo】缓冲区Buffer类
在 Muduo 网络库中,Buffer类用于处理网络 I/O 中的数据缓冲。防止应用程序读写太快而网络链路收发速度慢导致的速度不匹配问题。这个类封装了一个内部缓冲区(使用了vector<char>),并提供了一系列方法来操作这个缓冲区,如读取、写入、扩容等。 设计目标 Buffer类的设计目标主要有以下几点: 高性能:通过减少内存拷贝和分配次数来提高性能。易用性:提供简洁的API来方便地进行
阅读更多...
[集群聊天服务器]----(二)利用muduo网络库实现网络模块ChatServer
muduo 是由陈硕大佬个人开发的 TCP 网络库,有关于muduo网络库本人使用C++对muduo库的核心部分进行了重构,并且对每一个模块进行剖析介绍(详情见muduo网络库专栏),在使用muduo编写网络模块ChatServer之前,一定要对muduo网络库有一定的基本了解并且要对muduo网络库的基本使用有一定的了解。muduo 的线程模型为「one loop per thread + th
阅读更多...
【Muduo】套接字:InetAddress、Socket
在 Muduo中,InetAddress和Socket是偏向底层的两个模块,封装了底层的一些系统调用,提供了好用的接口。 InetAddress InetAddress通常用于表示一个网络地址。在 Muduo中,它可能是一个类,用于封装 IP 地址和端口号。 IP 地址和端口号:使用 sockaddr_in 存储和表示一个 IP 地址(可以是 IPv4 或 IPv6)和一个端口号。解析地址:
阅读更多...
[muduo网络库]——muduo库EventLoopThread类(剖析muduo网络库核心部分、设计思想)
接着之前我们[muduo网络库]——muduo库Thread类(剖析muduo网络库核心部分、设计思想),我们接下来继续看muduo库中的EventLoopThread类,它和Thread类息息相关。 EventLoopThread类 封装了eventloop线程也就是IO线程,eventloopthread会启动自己的线程,并在里面运行eventloop::loop()。 重要成员变量
阅读更多...
[muduo网络库]——muduo库InetAddress类(剖析muduo网络库核心部分、设计思想)
接着之前我们[muduo网络库]——muduo库EventLoopThreadPool类(剖析muduo网络库核心部分、设计思想),我们接着看完除去TcpServer的最后一个InetAddress类。InetAddress 类是 muduo 网络库中的一个重要类,用于表示网络中的 IP 地址和端口号。 InetAddress类 用于表示网络中的通信实体的地址信息,例如服务器地址、客户端地址等
阅读更多...
[muduo网络库]——muduo库EventLoopThreadPool类(剖析muduo网络库核心部分、设计思想)
接着之前我们[muduo网络库]——muduo库EventLoopThread类(剖析muduo网络库核心部分、设计思想),我们接下来继续看muduo库中的EventLoopThreadPool类,它和Thread以及EventLoopThread类息息相关。 EventLoopThreadPool类 事件循环线程池,管理所有客户端连接,每个线程都有唯一一个事件循环,可以调用setThread
阅读更多...
[muduo网络库]——muduo库TcpConnection类,万字总结(剖析muduo网络库核心部分、设计思想)
接着之前我们[muduo网络库]——muduo库Buffer类(剖析muduo网络库核心部分、设计思想),我们接下来继续看muduo库中的TcpConnection类。 TcpConnection类 TcpConnection类是muduo最核心的类,这个类主要封装了一个已建立的TCP连接,以及控制该TCP连接的方法(连接建立和关闭和销毁),以及该连接发生的各种事件(读/写/错误/连接)对应的
阅读更多...
重写muduo之TcpConnection
目录 1、 TcpConnection.h 2、 TcpConnection.cc 1、 TcpConnection.h TcpConnection底层绑定(管理)了一个Channel,Channel有事件被Poller通知后,会调用相应的回调,这些回调也是TcpConnection中包含的方法,将这些方法绑定了一下塞给channel作为回调,如果TcpConnection
阅读更多...
[muduo网络库]——muduo库Buffer类(剖析muduo网络库核心部分、设计思想)
接着之前我们[muduo网络库]——muduo库Socket类(剖析muduo网络库核心部分、设计思想),我们接下来继续看muduo库中的Buffer类。其实Buffer在我的另一篇博客里面已经介绍过了深究muduo网络库的Buffer类!!!,这里还是和这个之前几个类的方法保持一致,在梳理一遍Buffer类,给大家提供一个舒适的观感~ Buffer类 Buffer类封装了一个用户缓冲区,以及
阅读更多...
[muduo网络库]——muduo库Socket类(剖析muduo网络库核心部分、设计思想)
接着之前我们[muduo网络库]——muduo库Acceptor类(剖析muduo网络库核心部分、设计思想),我们接下来继续看muduo库中的Socket类。 Socket类 Socket类实际上就是封装socket fd。 重要成员变量 const int sockfd_; 因为Socket类实际上就是封装socket fd,所以成员变量也很简单,只有sockfd_。 重要成员方
阅读更多...