Muduo 多執行緒模型對比

2022-07-03 15:54:13 字數 2905 閱讀 4033

本文主要對比muduo多執行緒模型方案8 和方案9 。

方案8:reactor + thread pool ,有乙個執行緒來充當reactor 接受連線分發事件,將要處理的事件分配給thread pool中的執行緒,由thread pool 來完成事件處理。例項**見:examples/sudoku/server_threadpool.cc

這裡擷取關鍵部分**進行說明。

class

sudokuserver

void

start()

private

:void

onconnection(

const

tcpconnectionptr& conn)

void

onmessage(

const

tcpconnectionptr& conn, buffer* buf, timestamp)

}...}}

bool

processrequest(

const

tcpconnectionptr& conn, 

const

string& request)

else

return

goodrequest;

}static

void

solve(

const

tcpconnectionptr& conn,

const

string& puzzle,

const

string& id)

else

}eventloop* loop_;

tcpserver server_;

threadpool threadpool_; 

// 注意型別,方案8, reactor + threadpool

intnumthreads_;

timestamp starttime_;

};void

threadpool::start(

intnumthreads)  // 建立 thread pool,具體thread 排程這裡暫時不分析

}方案9:main-reactor + subreactors, one loop per thread, 有乙個主線程來扮演main-reactor 專門語句 accept 連線,其它執行緒負責讀寫檔案描述符(socket)

class

sudokuserver

void

start()

private

:void

onconnection(

const

tcpconnectionptr& conn)

void

onmessage(

const

tcpconnectionptr& conn, buffer* buf, timestamp)

...}

}bool

processrequest(

const

tcpconnectionptr& conn,

const

string& request)

...}

// 注意這裡沒有型別為threadpool的 threadpool_成員,整個類使用muduo預設執行緒模型的eventloopthreadpool,tcpserver 聚合了eventloopthreadpool

eventloop* loop_;

tcpserver server_;

intnumthreads_;

timestamp starttime_;

};void

tcpserver::setthreadnum(

intnumthreads)

void

tcpserver::start()

if(!acceptor_->listenning())

}void

eventloopthreadpool::start(

const

threadinitcallback& cb) // 開啟執行緒的方式是使用eventloopthread,這個類將eventloop 和 thread 封裝在一起實現 one loop per thread

if(numthreads_ == 0 && cb)

}總結一下,這裡所謂的reactor就是持有poller的結構(稍微有點狹隘,這裡先就這樣理解),poller負責事件監聽和分發。持有eventloop的結構就持有poller。

對於方案8只有乙個類持有eventloop,也就是只建立了乙個eventloop,這個loop就是reactor,其它的thread 是通過threadpool來實現的,因此只有reactor所在的執行緒來完成i/o,其它執行緒用於完成計算任務,所以說這個模型適合於計算密集型而不是i/o密集型。

對於方案9,存在多個reactor,其中main reactor 持有acceptor,專門用於監聽三個半事件中的連線建立,訊息到達和連線斷開以及訊息傳送事件都讓sub reactor來完成。由於main reactor 只關心連線建立事件,能夠適應高併發的io請求,多個subreactor的存在也能兼顧i/o與計算,因此被認為是乙個比較好的方案。

後面還會深入學習muduo網路庫相關的內容,包括reactor結構的簡化,執行緒池的實現,現代c++的編寫方式,使用c++11進行重寫等。現在看來c++11 thread library 提供的介面基本可以替換 posix thread library,雖然底層也許是通過posix thread實現的,畢竟linux核心針對nptl進行過修改。c++11 提供了 thread_local 來描述 執行緒區域性儲存,但是沒有pthread_key_create() 提供 destructor那樣的功能,或者遇到需要使用tls的地方轉過來使用posix 提供的介面。

muduo 多執行緒 執行緒池 reactor

Muduo 多執行緒模型對比

本文主要對比muduo多執行緒模型方案8 和方案9 方案8 reactor thread pool 有乙個執行緒來充當reactor 接受連線分發事件,將要處理的事件分配給thread pool中的執行緒,由thread pool 來完成事件處理。例項 見 examples sudoku serve...

linux多執行緒網路庫 muduo庫學習

什麼是muduo庫 muduo 是基於 reactor 模式 執行緒安全的 支援多核多執行緒的簡單易用的網路庫。符合現代c 程式設計規範 大量使用boost的開源網路庫。為什麼學習muduo庫 muduo庫對學習linux下面向過程c 程式設計 多執行緒程式設計 boost庫應用實踐,有非常大的幫助...

11執行緒 多執行緒模型

一 什麼是執行緒 為什麼要引入執行緒 二 引入執行緒機制後的變化 三 執行緒有的屬性 四 執行緒的實現方式 五 多執行緒模型 1 執行緒引入原因分析 2 執行緒 可以把執行緒理解為輕量級程序。執行緒是基本的cpu執行單元,也是程式執行流的最小單元。引入執行緒後不僅程序可以併發,程序內的執行緒也可以併...