0

初めてマルチスレッドを掘り下げていると言って、これを序文にします。並行性と同期に関する多くの資料を読んでも、与えられた要件に対する解決策がすぐには見つかりません。

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 です。単純にワーカーの終了を待つのではなく、ワーカー スレッドが終了したときにメイン スレッドに値を返し、メイン スレッドに通知する例はありますか?

4

2 に答える 2

1

ソリューションをゼロから開発することが目的の場合 (ネイティブ スレッド、キューなどを使用):

  1. スレッド保存キュー キューを作成します (追加/削除に関する Mutex/CriticalSection)
  2. キューに関連付けられたカウンティング セマフォを作成する
  3. 1 つまたは複数のワーカー スレッドをカウンティング セマフォで待機させる (つまり、スレッドがブロックされる)
    • セマフォは、スレッドが常にキューをポーリングするよりも効率的です
  4. メッセージ/ジョブがキューに追加されると、セマフォがインクリメントされます
    • スレッドが起きます
    • スレッドは 1 つのメッセージを削除する必要があります
  5. 結果を返す必要がある場合...
    • 別のセットアップ: Queue+ Semaphore+ WorkerThreads

その他の注意事項

ゼロからスレッド セーフ キューを実装することにした場合は、以下を参照してください。

そうは言っても、BOOSTをもう一度見てみましょう。私はライブラリを使用していませんが、私が聞いたところによると、関連するデータ構造 (スレッド セーフ キューなど) が含まれている可能性が高いと思われます。

MSDNからの私のお気に入りの引用:

「あらゆる種類のマルチスレッドを使用すると、非常に深刻で複雑なバグにさらされる可能性があります」

サイドバー

並行プログラミングを初めて検討する場合は、次のことを検討することをお勧めします。

  • あなたの目的は製品に適したコードを構築することですか、それとも単なる学習課題ですか?
    • 製造?既存の実績のあるライブラリを考慮してください
    • 学ぶ?コードを最初から書くことを検討する
  • ネイティブ スレッドの代わりに、非同期コールバックでスレッド プールを使用することを検討してください。
  • より多くのスレッド != より良い
  • スレッドは本当に必要ですか?
  • KISSの原則に従ってください。
于 2015-05-09T00:51:01.780 に答える