初めてマルチスレッドを掘り下げていると言って、これを序文にします。並行性と同期に関する多くの資料を読んでも、与えられた要件に対する解決策がすぐには見つかりません。
C++11 と Boost を使用して、ワーカー スレッドからメイン スレッドにデータを送信する方法を見つけようとしています。ワーカー スレッドは、アプリケーションの開始時に生成され、ロック フリー キューを継続的に監視します。オブジェクトは、さまざまな間隔でこのキューに入力されます。この部分は機能しています。
データが利用可能になると、メイン スレッドで処理する必要があります。これは、別のシグナルがワーカー スレッド上にないアプリケーションの残りの部分に送信されるためです。これは私が問題を抱えているものです。
ワーカー スレッドが完了するまで、ミューテックスまたは条件変数を介してメイン スレッドをブロックする必要がある場合、どのように応答性が向上しますか? データにアクセスできるように、単一のスレッドのままにしておくこともできます。ここで何かが欠けているに違いありません。
Boost::Asio が最適だと考えて、いくつかの質問を投稿しました。スレッド間でシグナルとデータを送信する方法の例がありますが、応答が示すように、物事はすぐに過度に複雑になり、完全には機能しません。
別のスレッドで作業を投稿するときに、シグナルを boost::asio::io_service に接続する方法は?
Boost::Asio と Main/Workers スレッド - 作業を投稿する前にイベント ループを開始できますか?
何人かの同僚と話した後、1 つの入力と 1 つの出力の 2 つのキューを使用することが提案されました。これは共有スペースにあり、出力キューはワーカー スレッドによって取り込まれます。ワーカー スレッドは常に実行されますが、おそらくアプリケーション レベルで、保留中のタスクがあるかどうかを確認するためにメイン スレッドに強制的に出力キューを調べるタイマーが必要です。
どこに注意を向けるべきかについてのアイデアはありますか? 私がやろうとしていることに対してうまくいくかもしれないテクニックや戦略はありますか? 次にタイマーを見ていきます。
ありがとう。
編集:これは、シミュレーション結果を後処理するプラグイン システムの製品コードです。可能な限り最初に C++11 を使用し、次に Boost を使用しています。Boost の lockfree::queue を使用しています。アプリケーションは 1 つのスレッドで必要なことを実行していますが、現在、パフォーマンスの問題があることがわかっている場所を最適化しようとしています (この場合、別のライブラリを介して行われている計算)。メイン スレッドには、データベース アクセスを含む多くの責任があります。そのため、ワーカー スレッドが実際に行うことを制限したいと考えています。
更新: std::thread を使用して、Boost lock::free キューを検査し、配置されたタスクを処理するワーカー スレッドを起動することにすでに成功しています。問題が発生しているのは、@Pressacco の応答のステップ 5 です。単純にワーカーの終了を待つのではなく、ワーカー スレッドが終了したときにメイン スレッドに値を返し、メイン スレッドに通知する例はありますか?