boost asio,執行緒池

2021-08-22 18:24:05 字數 1265 閱讀 8383

網上大部分人都講boost.asio用完成埠實現,並且實現了執行緒池,所以效率非常的高。

我在應用asio的時候發現完成埠是有,但是執行緒池確並不存在,而且在現有的架構下,要想用執行緒池來實現對資料的處理,可能寫出來不是很好看。

asio通過開啟執行緒呼叫io_service::run再呼叫win_iocp_io_service::run來處理收到的事件。

size_t run(boost::system::error_code& ec)

call_stack::context ctx(this);

size_t n = 0;

while (do_one(true, ec))

if (n != (std::numeric_limits::max)())

++n;

return n;}

do_one裡面為

實際上如果op->do_completion裡面有時間比較長的操作,這個執行緒同樣為死在這個地方。

因為只有乙個執行緒在驅動前面的run函式。

當然你也可以通過同時啟動幾個執行緒來呼叫run函式,這樣是可行的,但是這種手法確很笨拙,因為你可能一下啟動10個執行緒,卻只有乙個執行緒比較忙,

或者你的10個執行緒根本就忙不過來,這根有沒有使用iocp完全沒什麼兩樣。

做事情要力求完美,不要以為nb的大師不提供的東西,你就不能自已弄乙個。其實我覺得asio裡面c++的運用,非常的完美,但是從實用的角度來說,

還不如我以前乙個同事寫的iocp寫得好。

我們怎麼對asio這部分進行改良,讓他支援執行緒池的方式呢。

實際上我們只需要對win_iocp_io_service進行一些加工即可。

在do_one裡面

op->do_completion(last_error, bytes_transferred);

之前auto_work work(*this);

這個地方,實際上就是來計算當前有多少工作要做,

這個地方呼叫work_started

::interlockedincrement(&outstanding_work_);

只需要在這按照你的需求加入乙個執行緒就可以了。

演算法自已想吧,還存在work_finished函式,可以用來減少執行緒。

需要給win_iocp_io_service類增加乙個thread_group成員變數,供上面使用。

改良的方式不是很好,也比較不好看,

唉,完美只存在心裡,適可而止吧。

lixiaomail

2008-08-05

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...

執行緒 執行緒池

乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...

mysql 執行緒池 c MySQL執行緒池

mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...