System.Collections.Concurrent のコレクションは、すべての場合において完全にスレッドセーフですか? または、複数のスレッドから複数の同時コレクションを使用すると、理論的にデッドロックが発生する可能性がありますか?
ありがとう。
System.Collections.Concurrent のコレクションは、すべての場合において完全にスレッドセーフですか? または、複数のスレッドから複数の同時コレクションを使用すると、理論的にデッドロックが発生する可能性がありますか?
ありがとう。
確かに、タイプによっては、デッドロックを引き起こす方法で使用される可能性があります。たとえば、BlockingCollection.Takeは要素が使用可能になるまでブロックするため、これを UI スレッドと、Take のアイテムを生成するバックグラウンド スレッドで呼び出すと、UI スレッドを介して何かを同期する必要があります (COM 依存関係があるとします)。バックグラウンドで静かにマーシャリングする)、デッドロックが発生する可能性があります。スレッド化を扱うときはいつものように、「スレッドセーフ」クラスを使用している場合でも、妥当なレベルのパラノイアが推奨されます。
MSDN に記載されているように、クラスは (ほとんどの場合) スレッド セーフです。たとえば、ドキュメントにはConcurrentQueue<T>
明示的に次のように記載されています。
ConcurrentQueue の public および protected メンバーはすべてスレッドセーフであり、複数のスレッドから同時に使用できます。
必要な同期はすべて内部で処理されます。
BlockingCollection<T>.Dispose()
また、一部の型には、スレッド セーフではありませんが、MSDN で再び文書化されている など、いくつかの小さなスレッド セーフの問題があることに注意してください。
Dispose メソッドはスレッドセーフではありません。BlockingCollection の他のすべての public および protected メンバーはスレッド セーフであり、複数のスレッドから同時に使用できます。
そうは言っても、独自の同期を行っている場合は、これらの型の使用とは関係のないデッド ロックが発生する可能性があります。デッド ロックが発生している場合は、コードまたは使用しているライブラリ内の他の同期が原因である可能性が最も高いです。