題:
C ++ 11線程池實現
wilx
2014-08-26 17:50:25 UTC
view on stackexchange narkive permalink

我正在尋找基於C ++ 11線程工具的線程池實現。該庫最好應僅是標頭。許可證必須是BSD樣式或MIT樣式允許的許可證,即沒有GPL。

四 答案:
#1
+4
Dylan Corriveau
2015-05-15 22:02:32 UTC
view on stackexchange narkive permalink

似乎有一個 GitHub是為C ++ 11開發了一個小型庫的人。

它也只是一個中央頭文件(沒有要添加的cpp文件),並符合您的許可要求(它實際上使用了許可的免費軟件許可)。

#2
+3
einpoklum
2016-03-21 03:10:27 UTC
view on stackexchange narkive permalink

我注意到這個問題試圖從根本上問同樣的問題,除了我已經註意到了幾個問題之外,我想獲得一個關於優點和缺點的適當建議/評論,而不僅僅是列表。但是現在,這是我的列表:

  • CTPL-一個簡潔的僅包含單頭的庫;有兩種變體:一種僅依賴於標準庫,另一種使用Boost的無鎖隊列實現。此時大約有250行。
  • threadpool11 by TolgaHoşgör-“使用C ++ 11的線程池實現的快速,無鎖,跨平台,完整的CPU特徵。”聲稱在某些基準測試中擊敗了OpenMP;至少這意味著作者對它感到驕傲和自信,而不是僅僅把它放在那裡...〜590行,但是還有很多樣板許可等。所以大概是500行。
  • thread_pool,作者Tyler Hardin-一個單一類的.hpp + 1 .cpp庫(選擇放入.cpp中的代碼非常合理,因此與CTPL)。 〜290行
  • 基於Boost.ASIO的30行線程池實現...

現在,我沒有 使用了其中的任何一個,並且無法描述它們之間的區別,但是非常喜歡有使用線程池這樣做的經驗的人(在單獨的答案中)。

因此,我在github上的推薦人列表中看到了這一點。我的圖書館有所變化。仍然可以將一個源庫和一個源庫用作一個頭,但是現在它在POSIX上還具有與優先級隊列的協作線程。這對於解決線程池的遞歸問題非常有用。沒有屈服,就不可能在等待子計算的結果時避免阻塞。
哦,它也不再與C ++ 11兼容。不過,自述文件中記錄了最新的C ++ 11和14兼容版本,因此,只要具有一點git能力,就可以獲取和使用它們。
@Tyler:然後,可以請您編輯我的答案以反映您的圖書館現在的狀態嗎?或者,發布您自己的更長的答案,描述您的圖書館的優缺點。
請注意,關於Boost.ASIO實現的那30行內容(比較起來)並不公平,因為它使用了其他Boost工具,例如`boost :: asio :: io_service :: work`,`boost :: asio :: io_service`,和`boost :: thread_group`。
-1
#3
+1
d99kris
2017-12-14 20:14:12 UTC
view on stackexchange narkive permalink

ThreadPool

ThreadPool是使用C ++ 11線程API且不提供GPL的易於使用的僅標頭線程池庫

#4
+1
Daniel Langr
2020-04-24 19:48:23 UTC
view on stackexchange narkive permalink

我正在尋找基於C ++ 11線程工具的線程池實現。

這是一種通用描述。基本上,至少有兩種類型的線程池。首先,而且要簡單得多,您只需要排隊一些由功能對象表示的作業(任務),並將這些任務分配給正在運行的線程,這些線程就會在完成之前運行這些函子。如果我沒看錯,那麼所有推薦的解決方案都可以這種方式工作。

但是,這些簡單解決方案的主要缺點是它們無法暫停和繼續執行任務。這絕非易事,例如由OpenMP或TBB提供。考慮使用任務通過OpenMP計算斐波那契數的最簡單示例:

  int Fib(int n){if(n < 2)return n;整數x,y; #pragma omp task shared(x)x = Fib(n-1); #pragma omp task shared(y)y = Fib(n-2); #pragma omp taskwait返回x + y;}  

在這種情況下, Fib 函數在 #pragma omp taskwait 行處暫停並在子任務(任務中創建的任務)完成後恢復(甚至可以選擇在不同的線程上)。因此,您需要某種機制來“跳出”功能並再次“跳入”(C ++ 20的協程會有所幫助嗎?)。

對於純C ++,我發現了兩個線程池實現,稍微複雜一點:

  • cpp-taskflow-似乎只是標頭。他們稱之為“動態任務處理”功能,根據示例,該功能允許在運行的任務中創建新任務。但是我找不到等待子項任務完成的選項。

  • dougbinks / enkiTS-不僅僅是標題。有一些等待機制,但是我認為它是“阻塞”的,因為執行等待任務的線程不一定要在等待期間執行其他任務。

但是,我通過尋找現代C ++中的常規任務選擇器來找到這些庫,並且需要承認我對它們了解不多。如果有人可以提供更多詳細信息,那就太好了。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...