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
}
}
};
У меня есть несколько вопросов об этом подходе:
Существует ли существующая реализация пула потоков с OpenMP для C++? [Я знаю, что могу реализовать пул потоков с помощью boost::asio::io_service, но я бы предпочел не зависеть от этого]
С моим дизайном - как мы можем гарантировать, что потоки OpenMP будут "принадлежать" конкретному экземпляру ThreadPoolExecutor? Они не должны быть статичными для всех случаев.
Спасибо за любые советы и конструктивную критику этого подхода и предложения других реализаций.
1 ответ
Подводя итог: как описано в комментариях, OpenMP не является опцией для реализации общего пула потоков или исполнителя, потому что:
- OpenMP - это строго потоковая модель.
- Вы не можете назначить владельца для потоков OpenMP
- Нет контроля над потоками и внутренним пулом потоков