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? Они не должны быть статичными для всех случаев.

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

1 ответ

Решение

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

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