【问题标题】:ThreadPool implemented with OpenMP使用 OpenMP 实现的线程池
【发布时间】:2012-09-04 10:56:52
【问题描述】:

我需要为通用任务实现一个线程池执行器。我的想法是使用 OpenMP 进行线程管理。问题是我还不熟悉 OpenMP..

我尝试使用 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. 是否存在用于 C++ 的 OpenMP 线程池实现? [我知道我可以用 boost::asio::io_service 实现线程池,但我不想依赖它]

  2. 根据我的设计 - 我们如何保证 OpenMP 线程将由具体的 ThreadPoolExecutor 实例“拥有”?它们不应该对所有实例都是静态的。

感谢您对此方法的任何建议和建设性批评以及其他实现的建议。

【问题讨论】:

  • 第二个问题:你不能。 openmp 线程的管理是实现的工作。作为旁注:为什么需要基于 openmp 的实现?您看过(尚未正式发布的)boost threadpool 吗?或者Intel TBB
  • 恐怕 OpenMP 不适合这样的任务......
  • @Grizzly:谢谢。我知道 TBB 和提升线程池。但我的项目是其他开发人员的库,我不能轻易引入对这些产品的依赖。 OpenMP 会很好,因为它不需要额外的依赖项。
  • 不幸的是,无法保证某个对象是自包含的并且不会与其他 OpenMP 部分共享线程。 OpenMP 的设计并没有真正考虑 OOP。
  • @nogard:如前所述,openmp 对这项任务来说并不是真正的上帝(您无法控制线程并且别无选择,只能阻止调用)。以boost::thread 为基础的线程池怎么样(因为您的代码已经包含boost::unique_future 我认为这种依赖是可以的)或c++11 std::thread?如果没有其他可用的,甚至是 pthreads(将它们包装到类似 std::thread 的界面中非常简单)。

标签: c++ multithreading concurrency threadpool openmp


【解决方案1】:

总结一下:如 cmets 中所述,OpenMP 不是实现通用线程池或执行器的选项,因为:

  1. OpenMP 严格来说是一种 fork/join 线程模型。
  2. 您不能为 OpenMP 线程分配所有者
  3. 无法控制线程和内部线程池

【讨论】:

  • OpenMP 只需要你 fork 一次(第一次调用“omp parallel”)。人们倾向于使用 OpenMP 编写 forky-joiny 程序并不是标准的要求。
猜你喜欢
  • 2014-04-12
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
相关资源
最近更新 更多