2012-06-25 55 views
3

我目前有一個擁有大量線程的應用程序,這使得應用程序非常大。每個線程都是長時間運行的,基本上是對新電子郵件進行無限循環輪詢,然後處理它們。每個線程持有一個SSL連接,這就是線程對於應用程序運行良好的原因。線程池的設計模式

我想使用線程池。最簡單的方法是修正線程數量,然後在每個線程中添加10個用戶,但即使在這一點上,它似乎並沒有像1個用戶/線程一樣統一工作,因爲每個循環都需要很長時間來處理。另外這實際上不是線程池。

我的問題是 - 什麼是正確的設計模式,在這裏(因爲它肯定比我上面寫的更智能),以及是否有處理這口井的C++庫?將我指向Java實用程序也是有幫助的,因爲根據我的經驗,從Java實用程序計算設計模式非常容易。

回答

3

一個用戶/線程可能是一個很好的起點。任何阻止或阻止的事情都需要在自己的線程中運行,以避免被其他執行代碼阻擋或阻擋。如果電子郵件的實際處理將直接進行,則可將其置於「可運行」狀態,使用Java術語並提交給線程池。Java術語應該是ThreadPoolExecutor,並且自己寫一個簡單的術語並不難。你需要爲每個可能的CPU核心提供一個線程,以便從您的計算機獲得最多的工作。

如果每封電子郵件的工作不是很好,跳過線程池可能會更簡單快捷,只需在讀取器線程上完成工作即可。你已經付出了運行它的代價,你也可以把所有的工作都拿出來。

另一方面,如果處理電子郵件涉及阻塞或阻塞,您可能需要爲每個電子郵件啓動一個新線程。你最終可以得到很多的線程,但它可以獲得最大的工作量。你不想在你的電子郵件上落後於你的CPU使用率,只有5%。

1

我把一個BlockingDeque之間與在後端線程池的消費者。這將電子郵件製作者與消費者分離,並允許您在後端彙集消費者。看看這個:

Producer Consumer Example

0

我真的不明白你的聲明「似乎並不像均勻平衡工作爲1級的用戶/線程,因爲每個迴路是相當長時間來處理」。

在任何情況下,Active Object模式可能是一個優雅的一個,你的情況。這是其他6種模式的組合。實際上,這實現了具有很好抽象實體的線程池。

+0

活動對象可能會浪費每個活動對象的一個​​線程策略中的線程。你應該在每個N對象的池中有M個線程,但是你會遇到同步問題,我不確定這個問題的作者想要經歷什麼。 –

0

commons ThreadPool。 Altough Java - 它是開源的,您可以查看代碼並輕鬆移植到C++

1

有許多模式可以解決問題,但決策的關鍵在於理解模式的後果。 ACE website有一些可能適用的併發模式的論文,如Active ObjectProactorReactor。這些例子是C++,但是如果您追求自己的實現,則會有圖表和描述,這些圖表和描述將會很有幫助。

proactor可以提供完美的解決方案或作爲另一圖案的基礎。對於C++實現,我會推薦boost::asio庫:

  • 有相當詳細的文檔和示例。
  • SSL支持。
  • HTTP Server 3例子說明如何使用boost::asio一個線程池。

如果你不想在boost依賴做,那麼asio庫也分別here包裝。有關更多圖案和信息,請參閱this書。