簡體   English   中英

如何在舊版c ++上創建自己的線程池?

[英]How can I create my own thread pool on legacy c++?

由於pthread_create的高開銷,我面臨一個問題。 我已經在互聯網上找到了一個好的線程池庫,但是找不到適合我項目的庫,或者它們根本沒有用。

我對C ++相當陌生,我的編程技能很基礎,但是很好。 我編寫了很多程序(超過5年),只是沒有做任何面向對象的項目,甚至沒有使用過數據結構。

我非常感謝任何可以幫助我獲得創建自己的線程池所需的經驗和知識的材料或指南。

由於當前項目的限制,我將在Windows 10(mingw32)上使用普通的c ++(而不是C ++ 11),並且必須避免使用任何boost庫。

根據要求:關於問題:

我正在寫一個計算量大的項目。 我想使其運行更快,所以我決定使用pthreads。 但是,問題在於線程創建在循環內,並且pthread_create被調用了64次。

經過大量研究和嘗試,我發現這里是線程池的解決方案,但是我花了3天多的時間才能在線找到可以運行的實現,但無濟於事,所以我決定編寫自己的線程池實現。

關於可以檢查的代碼示例: 如何減少pthread_join的影響。 Mingw32,C ++

但是我意識到它的線程創建,而不是導致性能惡化的thread_join。

盡管有一些評論,但是基本線程池並不那么復雜。 它們比好的記錄器簡單,例如:)

首先,有兩個陳述。

  • pthread_create非常輕巧。 這不太可能是真正的瓶頸。 如果您的計算時間與創建線程所需的時間相當,那么您可能不需要一個線程。
  • C ++ 11是NORMAL C ++。 C ++ 03被稱為ARCHAIC。 我強烈敦促您重新考慮項目的“約束”(因為您似乎沒有使用外部庫,因此ABI不兼容對您來說應該不是問題),並且放棄了11歲的,過時且不足的編譯器。

現在,到線程池。 基本線程池包含3個主要部分:傳入消息隊列,傳出消息隊列和為這些隊列提供服務的線程。 根據設計的不同,這些消息可能是真實的消息(即字符串“親愛的線程,請計算5 + 10”),也可能是可調用的,只是線程調用了。 類型擦除的函數對象在這里效果最好。 因此,當消息為文本時,線程函數將具有一堆if()語句來處理不同的消息,當消息為可調用時,它將簡單地調用此可調用函數。 文本消息更易於維護,因為在文本本身中您有需要關心的所有內容。 另一方面,可調用對象具有生命周期,您應該考慮它的壽命-例如,將局部變量作為可調用對象將是有保證的災難。

另一部分是消息隊列本身。 首先,有兩個可行的設計選擇-每個線程都有自己的隊列,或者有一個共享隊列供所有線程使用。 第一個的好處是隊列上沒有爭用-一個讀者和一個作家。 共享隊列具有爭用性,但好處是它提供了自然的負載平衡-線程在准備處理新消息時將僅提取消息。

無鎖隊列通常是用作消息隊列的不錯選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM