2012-09-11 38 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