0

複数のコンシューマーを使用するマルチスレッドの状況でキューを実装する必要がありますが、キューを変更するスレッドは 1 つだけです (エンキュー)。Queue を使用しても安全ですか、それとも ConcurrentQueue の使用を検討する必要がありますか?

4

2 に答える 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 に答える