2014-02-26 97 views
4

最近,我一直在尋找線程併發任務庫。理想情況下,一個簡單的接口調用線程上的函數。任何時候都有n個線程,有些完成的速度比別人快,並且在不同的時間到達。C++ 11動態線程池

首先我嘗試了Rx,這在C++中很棒。我也研究過Blocks和TBB,但它們要麼依賴於平臺。對於我的原型,我需要保持平臺的獨立性,因爲我們不知道它會在什麼時候運行,並且可能會在做出決策時發生變化。

C++ 11有很多線程和併發的東西,我發現了很多像線程池這樣的例子。

https://github.com/bilash/threadpool

類似的項目使用帶的std ::螺紋和std ::互斥相同lambda表達式。

這看起來非常適合我需要的東西。有一些問題。這些池以定義數量的線程啓動,任務排隊直到線程空閒。

我如何添加新的線程? 刪除過期的主題? (.Join()??)

顯然,這對於已知數量的線程來說要容易得多,因爲它們可以在ctor中初始化,然後在dtor中加入()。

這裏的任何提示或指針來自具有C++併發經驗的人嗎?

+0

GCD或libdispatch http://en.wikipedia.org/wiki/Grand_Central_Dispatch –

+1

我使用Boost :: Asio來創建一個簡單的線程池。也許你想看看這個示例http://stackoverflow.com/q/14265676/991425 – Haatschii

+0

是的。我讀過GCD。 C++中的任何示例或教程源代碼?跨平臺支持IS boost嗎? – WebSight

回答

1
  1. 開始的最大線程數的系統可以支持:

    int Num_Threads = thread::hardware_concurrency(); 
    
  2. 爲了有效的線程池的實現,一旦線程根據NUM_THREADS創建,最好不要製造新的,或銷燬舊的(通過加入)。性能會受到影響,甚至會使您的應用程序比串行版本變慢。

    每個C++ 11線程應該在它們與一個無限循環功能運行,不斷地等待新的任務,抓住和運行。

    下面是如何這樣的功能附加到線程池:

    int Num_Threads = thread::hardware_concurrency(); 
    vector<thread> Pool; 
    for(int ii = 0; ii < Num_Threads; ii++) 
    { Pool.push_back(thread(Infinite_loop_function));} 
    
  3. 的Infinite_loop_function

    這是一個 「而(真)」 循環中,等待任務隊列

    void The_Pool:: Infinite_loop_function() 
    { 
        while(true) 
        { 
         { 
          unique_lock<mutex> lock(Queue_Mutex); 
    
          condition.wait(lock, []{return !Queue.empty()}); 
          Job = Queue.front(); 
          Queue.pop(); 
         } 
         Job(); // function<void()> type 
        } 
    }; 
    
  4. 將功能添加到您的隊列中

    void The_Pool:: Add_Job(function<void()> New_Job) 
    { 
        { 
         unique_lock<mutex> lock(Queue_Mutex); 
         Queue.push(New_Job); 
        } 
        condition.notify_one(); 
    } 
    
  5. 綁定任意函數到隊列

    Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object)); 
    

一旦整合這些成分,你有你自己的動態線程池。這些線程總是運行,等待工作要做。