本文主要對比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執行單元,也是程式執行流的最小單元。引入執行緒後不僅程序可以併發,程序內的執行緒也可以併...