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.pswp.cn/bicheng/74591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74591.shtml
英文地址,請注明出處:http://en.pswp.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…