2

にダブルチェック ロックを適用しても安全Dictionaryですか?

TryGetValueつまり、別のスレッドから他の「get/contains」メソッドを呼び出しても安全ですか? (他の get 以外のメソッドを呼び出さずに)。

updコレクションは N 人のリーダーと 1 人のライターにとって安全でしょうか? サイクル 10 のスレッドが、ダブルチェック ロックを使用してキー X で要素にアクセスしようとし、アクセスされた場合はそれを削除するとします。ある時点で、別のスレッドから (ロックを使用して) キー X を持つ要素を追加します。1 人の読者がこの要素を取得して削除する必要があると思います。

upd2、回答について、私の質問は混乱しています。実際に私は2つの質問をしました:

  1. TryGetValue異なるスレッドから他の「get/contains」メソッドを呼び出しても安全ですか? (他の get 以外のメソッドを呼び出さずに)。
  2. コレクションは N 人のリーダーと 1 人のライターにとって安全でしょうか?

最初の質問の答えは「はい」で、2 番目の質問の答えは「いいえ」です。

そのため、安全な場合もあれば安全apply double-checked lockingでない場合もあります。コレクションに同時に書き込みを行っているかどうかによって異なります。

4

2 に答える 2

3

ジェネリックDictionary<TKey, TValue>クラスについて話していると思います。そのクラスは、N 人のリーダーまたは 1 人のライターにとって安全です。したがって、それを変更しない限り、そこから読み取りたいスレッドをいくつでも持つことができ、ロックは必要ありません。

スレッドがディクショナリを変更する可能性がある場合は、ディクショナリへのアクセスを同期する必要があります。ReaderWriterLockSlimをお勧めします。

于 2012-12-29T21:11:58.750 に答える
1

安全であると文書化されていないため、これは安全ではありません。1人のライターとN人のリーダーを持つことはできません。

ドキュメントからの該当する文は次のとおりです。

コレクションが変更されない限り、ディクショナリは複数のリーダーを同時にサポートできます。

実際、Reflectorを使用して辞書を覗いてみると、安全ではないことがわかりますが、それは重要ではありません。重要なのは、文書化されていないプロパティはいつでも変更される可能性があり、誰も知らないバグを本番環境に導入する可能性があるため、信頼できないということです。

また、これを安全であるとテストすることはできません。それはあなたの箱で働き、どこかで壊れるかもしれません。これがスレッドバグの性質です。それだけの価値はありません。

于 2012-12-29T21:54:41.293 に答える