4

次のように定義された 4 つのレベルのデータ構造があります。

Dictionary<Type1, Dictionary<Type2, Dictionary<Type3, List<Type4>>>>

全体が、スレッドセーフも維持するクラスにカプセル化されています。現在、データの読み取り/操作中にコレクション全体をロックするだけです (読み取りは、書き込みよりも桁違いに一般的です)。

DictionaryConcurrentDictionaryListで置き換えようと考えていましたConcurrentBag(そのアイテムは注文する必要はありません)。

そうする場合、ロックを解除して、並行コレクションが正しく機能することを確認できますか?

4

2 に答える 2

6

私は質問にほぼ1年遅れています..しかし、誰かがMatějZábskýと同様の立場にあることに気付いた場合に備えて、自問してください:

Dictionary<Tuple<Type1, Type2, Type3>, List<Type4>>代わりにa を使用できますか?

作業がかなり簡単になり、ハッシュテーブル(つまり辞書)がやや重い定数コンポーネントを持つO(1)データ構造であることを考慮すると( a に移行するとさらにConcurrentDictionary高速になります)、パフォーマンスも向上する可能性があります。また、使用するメモリも少なくなり、ConcurrentDictionary.

もちろんType2、特定のType1キーに対して特定のすべてを列挙する必要がある場合は、ネストされた辞書が最適です。しかし、それは要件ですか?

于 2011-12-12T10:19:30.227 に答える
4

同時収集はデータの破損やクラッシュを防ぎますが、コードは現在のものと意味的に同等ではありません。たとえば、並行辞書の 1 つを反復処理する場合、項目の一部は異なる update に属している可能性があります

ディクショナリから返される列挙子は、ディクショナリへの読み取りおよび書き込みと同時に安全に使用できますが、ディクショナリの瞬間的なスナップショットを表すものではありません。列挙子を介して公開されるコンテンツには、GetEnumerator が呼び出された後にディクショナリに加えられた変更が含まれる場合があります。

現在の正確な動作を維持したいが、ロックのコストを節約したい場合は、ReaderWriterLockSlimでロックすることをお勧めします。これは、書き込みよりも読み取りが多い場合に特に適しています。

于 2011-02-09T12:49:25.543 に答える