複数のコンシューマーを使用するマルチスレッドの状況でキューを実装する必要がありますが、キューを変更するスレッドは 1 つだけです (エンキュー)。Queue を使用しても安全ですか、それとも ConcurrentQueue の使用を検討する必要がありますか?
2 に答える
2
Enqueue
とはどちらもDequeue
、キューを変更する操作です。したがって、 を呼び出す 1 つのスレッドと を呼び出すEnqueue
別のスレッドがDequeue
ある場合、2 つの呼び出しを同期する必要があります。
Queue<T> Classを使用している場合、キューはスレッドセーフではないため、呼び出しを
lock
ステートメントでラップして同期する必要があります。ConcurrentQueue<T> Classを使用している場合、キューはスレッドセーフであり、同期を行います。
于 2013-09-22T05:19:29.810 に答える
2
フレームワーク 4 以降を使用している場合、Producer/Consumer パターン用に特別に設計されたBlockingCollectionを使用することをお勧めします (内部的にはデフォルトで ConcurrentQueue です)。ロック/モニターについてあまり考えなくても、スレッド間で生成と消費を簡単に調整できます。GetConsumingEnumerable()を使用してアイテムを消費するだけで、他の手動による同期作業は必要ありません。MSDN の例
于 2013-09-22T05:25:02.287 に答える