5

現在、複数のプロデューサーと単一のコンシューマーを持つキューがあります。

コンシューマ スレッドの動作が遅い。また、コンシューマーはピーク操作によってキューから要素を取得し、消費操作が完了するまで、要素をキューから削除することはできません。これは、プロデューサー スレッドがサイド オペレーションとして、その時点で完全に処理されていないすべての要素のスナップショットも取得するためです。

ここで、複数のコンシューマーをサポートするようにコードを変更したいと考えています。たとえば、3 つのスレッドがあるとします。1 つのスレッドが最初の要素を取得し、peek 操作で読み取ることができます。2 番目のコンシューマー スレッドは 2 番目の要素を取得できますが、キューが 2 番目の要素の取得をサポートしていないため、それを取得する方法がありません。

そのため、標準の ConcurrentLinkedQueue (私が現在使用している) を使用するオプションはありません。

プライオリティ キューを使用することを考えていますが、各要素に、この要素が既にスレッドによって使用されているかどうかを示すフラグを関連付ける必要があります。

この問題に最も適したデータ構造はどれですか?

4

2 に答える 2

6

実際には 2 つのキューが必要なようです。

  • 未処理
  • 進行中

コンシューマーは、未処理のキューからアトミックに (ロックを介して) プルし、進行中のキューに追加します。そうすれば、複数のコンシューマーが同時に作業できますが、プロデューサーは必要に応じて両方のキューのスナップショットを取得できます。コンシューマがタスクを完了すると、進行中のキューから削除されます。(それは実際にはキューである必要はありません。キュー自体から「プル」するものは何もないためです。簡単に追加および削除できるコレクションです。)

転送をアトミックにするためにロックが必要になることを考えると、おそらく基礎となるキューを並行キューにする必要はありません。すべての共有アクセスをすでに保護しているでしょう。

于 2011-04-28T09:08:46.740 に答える