Мне нужно реализовать пул потоков для общих задач. Моя идея заключается в использовании 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? Они не должны быть статичными для всех случаев.
Спасибо за любой совет & конструктивные критики этого подхода & предложения других реализаций.
Подводя итог: как описано в комментариях, OpenMP не является опцией для реализации общего пула потоков или исполнителя, потому что:
Других решений пока нет …