5

一般的なタスク用のスレッド プール エグゼキューターを実装する必要があります。私の考えは、スレッド管理に 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. OpenMP for C++ を使用したスレッド プールの既存の実装はありますか? [boost::asio::io_service でスレッドプールを実装できることはわかっていますが、それに依存したくない]

  2. 私の設計では、OpenMP スレッドが具体的な ThreadPoolExecutor インスタンスによって「所有」されることをどのように保証できますか? すべてのインスタンスに対して静的であってはなりません。

このアプローチのアドバイスと建設的な批評家、および他の実装の提案に感謝します。

4

1 に答える 1

2

要約すると、コメントで説明されているように、OpenMP は汎用スレッド プールまたは実行プログラムを実装するためのオプションではありません。

  1. OpenMP は厳密には fork/join スレッド モデルです。
  2. OpenMP スレッドの所有者を割り当てることはできません
  3. スレッドと内部スレッドプールを制御できない
于 2012-09-18T05:17:11.120 に答える