インタラクティブなアプリケーションで、CPU を大量に消費するマルチタスク可能なジョブを管理する必要があります。背景として、私の特定のアプリケーションはエンジニアリング設計インターフェースです。ユーザーがモデルのさまざまなパラメーターやオプションを微調整すると、複数のシミュレーションがバックグラウンドで実行され、完了時に結果が表示されます。ユーザーがまだ値を編集している可能性もあります。複数のシミュレーションにはさまざまな時間がかかるため (ミリ秒のものもあれば、5 秒かかるものもあれば、10 分かかるものもあります)、基本的にはフィードバックをできるだけ早く表示することですが、多くの場合、以前に開始されたが不要になったジョブは中止されます。ユーザーの変更のうち、既にそれらが無効になっています。ユーザーの変更が異なれば、異なる計算が無効になる可能性があるため、いつでも 10 の異なるシミュレーションを実行できます。
この種のアプリケーションを処理するためのコード レベルの方法は、ある種のマルチスレッド ジョブ キューであると確信しています。これには、実行のためにジョブを送信する機能、タスクの優先度を設定する機能、ジョブが完了するのを待つ機能、依存関係を指定する機能 (このジョブを実行しますが、ジョブ X とジョブ Y が完了した後でのみ)、いくつかの基準に適合するジョブのサブセットをキャンセルする機能、何をクエリする機能が含まれます。ジョブが残り、ワーカー スレッドの数と優先順位が設定されます。また、マルチプラットフォームのサポートも非常に便利です。
これらはソフトウェアの新しいアイデアや要望ではありませんが、私はアプリケーションの初期設計段階にあり、そのようなタスクを管理するためにどのライブラリを使用するかを選択する必要があります。私は過去に C で大まかなスレッド マネージャーを作成しましたが (これは通過儀礼だと思います)、自分の以前のハックではなく、最新のツールを使用して作業を行いたいと考えています。
最初に考えたのは、OpenMPを実行することですが、それが私が望むものかどうかはわかりません。OpenMP は、細かいレベルでの並列化、ループの自動展開などに最適です。マルチプラットフォームである一方で、#pragmas でコードに侵入します。しかし、ほとんどの場合、大規模なタスクを管理するようには設計されていません。特に、保留中のジョブをキャンセルしたり、依存関係を指定したりします。可能ですが、エレガントではありません。
Google Chrome では、最も些細なタスクでもこのようなジョブ マネージャーを使用していることに気付きました。設計の目標は、ユーザー インタラクション スレッドを可能な限り軽量かつ機敏に保つことであるように思われるため、非同期で生成できるものはすべてそうする必要があります。Chrome のソースを見ると、これは一般的なライブラリではないように見えますが、設計が非同期起動を使用して対話を高速に保つ方法を見るのは興味深いことです。これは、私がやっていることと似てきています。
まだ他のオプションがあります:
Surge.Act:ジョブを定義するための Boost のようなライブラリ。OpenMP で構築されていますが、依存関係の連鎖が可能で、これは素晴らしいことです。クエリを実行したり、ジョブをキャンセルしたりできるマネージャーがいるような気がしないようです。古いプロジェクトなので、それに依存するのは怖いです。
Job Queueは私が考えているものにかなり近いですが、これは 5 年前の記事であり、サポートされているライブラリではありません。
Boost.threadsには、プラットフォームに依存しない優れた同期がありますが、それはジョブ マネージャーではありません。POCOは、タスクを起動するための非常にクリーンな設計を備えていますが、タスクをチェーンするための完全なマネージャーではありません。(私はPOCOを過小評価しているかもしれませんが)。
そのため、利用可能なオプションはありますが、私は満足しておらず、自分のライブラリをもう一度ロールアップしたいという衝動を感じています. しかし、私はむしろすでに存在するものを使用したいと思います。検索した後でも(ここSOとネットで)、適切に感じるものは何も見つかりませんでしたが、これはしばしば必要とされる一種のツールであるに違いないので、コミュニティライブラリまたは少なくとも一般的なデザインが確実にあります. SO にはjob queuesに関する投稿がいくつかありましたが、適合するものは何もありません。
ここでの私の投稿は、私が見逃した既存のツール、および/またはそのような独自のマルチスレッド ジョブ キューをどのように展開したかをすべて質問することです。