0

コレクションと同時に動作する必要がある複数のスレッドがある場合、通常は の下のコレクションを使用しSystem.Collections.Concurrentます。
ただし、これらのコレクションは、非並行コレクションに比べて高価です。場合によっては、それらを非並行コレクションに安全に置き換えることができるかどうか疑問に思います。

たとえば、最初にデータを入力するディクショナリがあり、後でそれから読み取るか、キーが存在するかどうかを確認するだけで書き込みや変更を行わないいくつかのスレッド (またはタスク) を生成するとします。

そのようなシナリオでは、 を使用しても安全ですかDictionary<TKey, TValue>、それとも を使用する必要がありますConcurrentDictionary<TKey, TValue>か?

また、一般的なケースでは、コレクションが変更されない限り、すべての標準コレクションが複数のリーダーをサポートしていると想定できますか?

4

1 に答える 1

2

たとえば、最初にデータで埋めた辞書があり、後でそれから読み取るだけ、またはキーが存在するかどうかを確認するだけで、書き込みや変更を行わないスレッド(またはタスク)をいくつか生成するとします。

はい、ライターがいない限り、複数のスレッドから安全に読み取ることができます。最後の書き込みと最初の読み取りの間にメモリバリアがあることを確認する必要がありますが、ディクショナリにデータを入力した後にスレッドを生成する場合、それは問題にはなりません。Dictionary<,>

ドキュメントから:

Dictionary<TKey, TValue>コレクションが変更されない限り、Aは複数のリーダーを同時にサポートできます。

于 2013-03-12T08:19:54.693 に答える