2 つのスレッドが同時にアクセスできるキューが必要です。1 つのスレッドが別のアイテムをデキューしている間に、1 つのアイテムをキューに入れることができます。Queue<T>
クラスはこの要件を満たしていますか? それとも、ゼロから実装する必要がありますか (たとえば、このような単一のプロデューサー/コンシューマー循環キューの実装を使用します)?
3 に答える
使用している場合は、 ConcurrentQueue.NET 4.0
を使用できます。これが推奨される方法です。
それ自体に関してQueue<T>
、MSDNページには次のように記載されています(セクションまでスクロールダウンしますThread Safety
:
コレクションが変更されない限り、キューは複数のリーダーを同時にサポートできます。それでも、コレクションの列挙は本質的にスレッドセーフな手順ではありません。列挙中のスレッド セーフを保証するために、列挙全体でコレクションをロックできます。読み取りおよび書き込みのために複数のスレッドがコレクションにアクセスできるようにするには、独自の同期を実装する必要があります。
これらのソリューションに加えて、独自のスレッド セーフ キューを実装できます。スレッド セーフを実現する 1 つの方法は、不変性です (ただし、これにはロックが必要です)。不変キューの作成については、Eric Lippert のブログ (こちら) を参照してください。または、 F# ベースのデータ型を利用することもできますが、そのほとんどは不変です。
あなたが言及したプロデューサー/コンシューマーからコンシューマーを実装している場合、BlockingCollectionはあなたの友達です。そうでなければ、他の人が言ったように、ConcurrentQueue . BlockingCollection を使用すると、削除する要素がない場合に .Take() を呼び出してブロックすることができ、while (true)
.
最も簡単な方法は、ConcurrentQueue
.NET 4 を実行している場合、Microsoft から直接使用することです。:)