0

アプリケーションの設計

プロデューサー スレッド、複数のキュー (実行時に作成)、およびコンシューマー スレッドを持つ C++ アプリケーションがあります。

プロデューサ スレッドは、Tcp/Ip 経由でデータを取得し、それぞれのキューに入れます (たとえば、データがタイプ A で、キュー A に入れられる場合)。

コンシューマ スレッドは現在、1 から n までのキューをループして、各キューからのデータを処理します。

要件に従って、最後に更新された、または最も更新されていないキューを追跡する必要はありません。いずれかのキューが更新されている限り、コンシューマーは 1 ~ n 個のキューを処理する必要があります。

キューのサイズのいずれかが定義された制限を超える場合、プロデューサー スレッドは新しいアイテムを挿入する前に最初のアイテムをポップします (キュー サイズを管理するため)。

スレッド間のリソース同期とシグナリング:

この実装では、リスナーからのデータを持つキューがなくなるまで、コンシューマ スレッドはスリープする必要があります。コンシューマー スレッドは、プロデューサーがデータをいずれかのキューに入れる場合にのみ起動する必要があります。

複数のキューは、mutex を使用して 2 つのスレッド間で同期されます。プロデューサがいずれかのキューにデータを入れるたびにコンシューマ スレッドをウェイクアップするために、イベント シグナリングがスレッド間に実装されます。

ただし、この方法でコンシューマー スレッドをウェイクアップするように通知すると、キューのいずれかにデータがあっても、コンシューマーがスリープ状態になる可能性があります。

問題:

このシナリオを考えてみましょう。コンシューマーが n 番目のキューのデータを処理していると考えてください。同時に、プロデューサがデータを n-1、n-2 キューに入れる可能性があり、コンシューマが起動して n 番目のデータを処理しているため、シグナリングは有効ではありません。コンシューマーが n 番目のキュー データの処理を完了すると、スリープ状態になり、n-1、n-2 のデータは、リスナーによってさらにシグナルが与えられるまで処理されません。

このシナリオにどのように対処できますか? 人々はセモフォアの使用も勧めています。セマフォはこのシナリオに関連していますか?

前もって感謝します。

4

3 に答える 3

4

これは C++11 の古典的な例ですstd::condition_variable

この場合の条件は、消費可能なリソースの可用性です。消費者スレッドが仕事を使い果たした場合、wait彼は効果的にスリープ状態にする条件変数にいます。プロデューサーnotifyは、キューに挿入するたびに s を実行します。キューの競合が最小限に抑えられるようにロックを調整するように注意する必要がありますが、コンシューマーが通知を見逃して作業が利用可能であるにもかかわらずスリープ状態になるというシナリオを回避する必要があります。

于 2013-09-17T10:51:26.920 に答える
0

シグナルから作成されたファイル記述子でそれを使用selectして待機することができます->タイムアウトを待機し(それらを選択します)、シグナルが受信されたときにウェイクアップします(シグナルはマスクおよびブロックする必要があります)。signalfd(look man signalfd) が読み取れる場合は、そこから読み取り、シグナル番号struct signalfd_siginfoを確認できます (通信に使用している場合)。ssi_signo

于 2013-09-17T11:20:04.003 に答える