ThreadPool реализован с помощью OpenMP

Мне нужно реализовать пул потоков для общих задач. Моя идея заключается в использовании OpenMP для управления потоками. Проблема в том, что я еще не знаком с OpenMP ..

Я пытался найти существующую реализацию универсального ThreadPool с OpenMP, но пока не нашел. То, что я хотел бы иметь в конце концов, очень похоже на 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? Они не должны быть статичными для всех случаев.

Спасибо за любой совет & конструктивные критики этого подхода & предложения других реализаций.

3

Решение

Подводя итог: как описано в комментариях, OpenMP не является опцией для реализации общего пула потоков или исполнителя, потому что:

  1. OpenMP — это строго потоковая модель.
  2. Вы не можете назначить владельца для потоков OpenMP
  3. Нет контроля над потоками и внутренним пулом потоков
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]