2014-01-12 60 views
5

有關於創建一個簡單的線程池,如Sample1Sample2ASIO提升:不同的線程池不同的任務

我想,雖然實現的淨許多例子就是有不同的任務一個單獨的線程池。例如,應用程序可能有一個用於處理傳入TCP連接的線程池(我們稱之爲網絡池),另一個池用於與數據庫(數據庫池)交談。

這些傳入的tcp請求可能需要來自數據庫的信息。在這種情況下,它需要請求數據庫池中的那些線程執行查詢,並異步返回結果。

是否有推薦的方法來使用boost :: asio?它會爲每個池有一個io_service實例嗎?那些線程應該如何相互通信(使用boost)?

我明白要解釋所有這些,代碼將不會是那麼簡單和瑣碎,但如果可能的話,某些類型的僞代碼將不勝感激。

謝謝!

+2

國際海事組織,最簡單的方法是把每個拉一個單獨的'io_service'。爲了溝通,這些'io_service'之間的'後'函數(注意,不能知道哪個線程會處理你的文章)。 –

回答

2

線程/線程池之間的通信應該通過線程安全隊列。

在你的例子中,你應該有一個用於處理網絡連接的網絡線程池,用於執行網絡請求的進程池,以及數據庫連接/線程池(每個數據庫一個池;每個數據庫連接一個線程,但可能你可以有多個連接到同一個數據庫)。

您還需要線程安全隊列,一個用於網絡池,一個用於進程池,另一個用於每個數據庫池。

假設您有一個網絡請求需要從數據庫中獲取信息。您將在網絡線程上執行時收到請求,並將請求的處理程序追加到進程隊列中。

進程處理程序(在進程線程中)會看到請求需要來自數據庫的某些內容,因此它會將數據庫請求以及回調處理程序附加到適當的數據庫隊列中。

適當的數據庫線程將從數據庫隊列中提取請求,執行查詢,返回結果並將結果添加到回調處理程序。包含數據庫結果的回調處理程序對象將被推送到進程隊列中。

然後,回調處理程序(在進程線程中)將繼續執行請求,並可能打包響應消息,然後將其壓入網絡隊列。

網絡處理程序(在網絡線程中)然後會選取響應消息並將其傳遞(根據需要進行編碼)。

一個線程安全隊列的例子可以找到here

雖然有點複雜,但您可以看到一個應用服務器的實現,它可以處理您正在討論的內容here,儘管它可能對您正在嘗試執行的操作過度。源代碼有相當詳細的文檔,所以你應該能夠關注它並看看它在做什麼。

我的示例對asio使用boost(請參閱同一系統中的TCP Connection implementation),但它不使用boost io_service作爲處理程序。

+0

謝謝你,對於遲到的回覆感到抱歉。有一個問題。在你的例子中,你有三個池(網絡,進程,數據庫)。如果只有兩個池,那麼它是否也能正常工作,以便網絡池將通過某種線程安全消息隊列直接與數據庫池進行通信,使用您描述的相同機制?再次感謝。 – TDL