一般的なタスク用のスレッド プール エグゼキューターを実装する必要があります。私の考えは、スレッド管理に 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
}
}
};
このアプローチについていくつか質問があります。
OpenMP for C++ を使用したスレッド プールの既存の実装はありますか? [boost::asio::io_service でスレッドプールを実装できることはわかっていますが、それに依存したくない]
私の設計では、OpenMP スレッドが具体的な ThreadPoolExecutor インスタンスによって「所有」されることをどのように保証できますか? すべてのインスタンスに対して静的であってはなりません。
このアプローチのアドバイスと建設的な批評家、および他の実装の提案に感謝します。