アプリケーションの設計
プロデューサー スレッド、複数のキュー (実行時に作成)、およびコンシューマー スレッドを持つ C++ アプリケーションがあります。
プロデューサ スレッドは、Tcp/Ip 経由でデータを取得し、それぞれのキューに入れます (たとえば、データがタイプ A で、キュー A に入れられる場合)。
コンシューマ スレッドは現在、1 から n までのキューをループして、各キューからのデータを処理します。
要件に従って、最後に更新された、または最も更新されていないキューを追跡する必要はありません。いずれかのキューが更新されている限り、コンシューマーは 1 ~ n 個のキューを処理する必要があります。
キューのサイズのいずれかが定義された制限を超える場合、プロデューサー スレッドは新しいアイテムを挿入する前に最初のアイテムをポップします (キュー サイズを管理するため)。
スレッド間のリソース同期とシグナリング:
この実装では、リスナーからのデータを持つキューがなくなるまで、コンシューマ スレッドはスリープする必要があります。コンシューマー スレッドは、プロデューサーがデータをいずれかのキューに入れる場合にのみ起動する必要があります。
複数のキューは、mutex を使用して 2 つのスレッド間で同期されます。プロデューサがいずれかのキューにデータを入れるたびにコンシューマ スレッドをウェイクアップするために、イベント シグナリングがスレッド間に実装されます。
ただし、この方法でコンシューマー スレッドをウェイクアップするように通知すると、キューのいずれかにデータがあっても、コンシューマーがスリープ状態になる可能性があります。
問題:
このシナリオを考えてみましょう。コンシューマーが n 番目のキューのデータを処理していると考えてください。同時に、プロデューサがデータを n-1、n-2 キューに入れる可能性があり、コンシューマが起動して n 番目のデータを処理しているため、シグナリングは有効ではありません。コンシューマーが n 番目のキュー データの処理を完了すると、スリープ状態になり、n-1、n-2 のデータは、リスナーによってさらにシグナルが与えられるまで処理されません。
このシナリオにどのように対処できますか? 人々はセモフォアの使用も勧めています。セマフォはこのシナリオに関連していますか?
前もって感謝します。