4

多くのスレッドが にアクセスできますsummary。各スレッドには、辞書にアクセスするための一意のキーがあります。

Dictionary<string, List<Result>> summary;

次の操作にはロックが必要ですか?

  1. summary[key] = new List<Result>()
  2. summary[key].Add(new Result());

スレッドごとに異なるキーでディクショナリにアクセスするのでロックは必要ないようですが、(1)は他のトレッドと並行してディクショナリに新しいレコードを追加するので問題になりませんか?

4

3 に答える 3

5

はい、ロックを使用する必要があります。

ディクショナリは、追加操作に対してスレッド セーフではありません。.NET 4 を使用している場合は、ConcurrentDictionaryへの切り替えを検討してください。それ以外の場合は、独自のスレッド セーフ コレクション ( thisなど) を作成する必要があります。

コレクションへのアクセスを同期するためにReaderWriterLockSlimを使用することを検討してください (ConcurrentDictionary を使用しない場合)。

于 2012-06-17T15:13:45.537 に答える
2

辞書へのすべての書き込みアクセスはロックする必要があります。異なるキーへのアクセスがスレッドセーフであるという保証はなく、実際にはそうではありません。

MSDNから:

コレクションが変更されない限り、ディクショナリは複数のリーダーを同時にサポートできます。それでも、コレクションの列挙は本質的にスレッドセーフな手順ではありません。列挙が書き込みアクセスと競合するまれなケースでは、列挙全体の間、コレクションをロックする必要があります。読み取りおよび書き込みのために複数のスレッドがコレクションにアクセスできるようにするには、独自の同期を実装する必要があります。

于 2012-06-17T15:14:23.490 に答える
0

デフォルトでは、Dictionary はスレッドセーフではありません。何を追加するかは問題ではありません。そして最も重要なことは、異なるスレッドからの同時追加を制御できないことです。したがって、確実にロックが必要です。または、スレッド セーフ コレクションに切り替えます (つまり、.NET 4+ の場合は CocnurrentDictionary)。

于 2012-06-17T15:17:58.573 に答える