9

簡単な質問私が持っていると仮定しますConcurrentDictionary

私が使用TryAddするContainsKey方法

ここで、100 スレッドから処理を開始したとします。メソッドで新しいキーを追加しているときに3つのスレッドが別の3つのスレッドでメソッドTryAddでキーが存在するかどうかを尋ねると仮定しますContainsKey

ContainsKey結果を返す前に、これらの 3 つのスレッドがプロセスを追加するのを待ちますか?

または、それらは同期されていません。つまり、これらの 3 つのスレッドのいずれかが、ContainsKey メソッドで要求しているキーを追加している可能性がありますが、プロセスがまだ完了していないため、取得しようとしていた答えは false になります。

答えは非常にTy C#WPF .net 4.5最新

4

1 に答える 1

12

「いいえ」(Samのコメントを参照)、さらに、ConcurrentDictionaryへの他のアクセスまたはメソッド呼び出し全体で確立されたアトミックガードはありません。ContainsKey

つまり、次のコードは壊れています

// There is no guarantee the ContainsKey will run before/after
// different methods (eg. TryAdd) or that the ContainsKey and another
// method invoked later (eg. Add) will be executed as an atomic unit.
if (!cd.ContainsKey("x")) {
  cd.Add("x", y);
}

代わりにTry*メソッドを一貫して使用する必要があります

cd.TryAdd("x", y);

特殊化された同時実行メソッドを超えてさらに同期 (または原子性) を保証する必要がある場合は、より大きなモニター/ロック コンテキストを確立する必要があります。

于 2014-08-20T00:30:46.713 に答える