2012-09-11 36 views
3

我需要爲通用任務實現一個線程池執行器。我的想法是使用OpenMP進行線程管理。問題是,我不熟悉與OpenMP ..用OpenMP實現的ThreadPool

我試圖找到與OpenMP的通用ThreadPool的現有實現,但到目前爲止我還沒有找到一個。我想有到底是什麼非常相似java.util.concurrent.ThreadPoolExecutor

template <typename Return, typename Task> 
class ThreadPoolExecutor 
{ 
public: 
    ThreadPoolExecutor(int threadCount); 

    // asyncronous invoke 
    boost::unique_future<Return> submit(const TaskPtr & task); 

    // blocking call 
    std::vector<Return> invokeAll(const std::vector<TaskPtr> & tasks) 
    { 
     // submit all tasks + wait for completion 
     #pragma omp parallel default(shared) 
     { 
      // call tasks here 
     } 
    } 
}; 

我對這個方法有幾個問題:

  1. 是否有存在的執行線程池的使用OpenMP的C++? [我知道我可以使用boost :: asio :: io_service實現線程池,但我不想依賴於它]

  2. 我的設計 - 我們如何保證OpenMP線程將由具體的「擁有」 ThreadPoolExecutor實例?它們不應該對所有實例都是靜態的。

感謝您對這種做法其他實現的&建議的任何意見&建設性的批評。

+1

對於你的第二個問題,你不能將業主:不能。對openmp線程的管理是實現的工作。作爲旁註:爲什麼你需要基於openmp的實現?你看過(尚未官方)[boost線程池](http://threadpool.sourceforge.net/)嗎?或者[Intel TBB](http://threadingbuildingblocks.org/)? – Grizzly

+0

恐怕OpenMP不適合這樣的任務... – Tudor

+0

@Grizzly:謝謝。我知道TBB和增加線程池。但是我的項目是其他開發人員的圖書館,我不能輕鬆引入對這些產品的依賴關係。 OpenMP會很好,因爲它不需要額外的依賴關係。 – nogard

回答

2

只是爲了總結:作爲評論OpenMP的描述,不是實行通用線程池或執行人的選擇,因爲:

  1. OpenMP是嚴格意義上的叉/加入線程模型。
  2. 爲OpenMP的線程
  3. 在線程沒有控制和內部線程池
+0

OpenMP只要求您分叉一次(第一次調用「omp parallel」)。人們傾向於使用OpenMP編寫forky-joiny程序並不是標準的要求。 – Jeff