1. ホーム
  2. c#

[解決済み] ConcurrentDictionary TryRemove が false を返すのはいつ?

2023-05-13 02:54:50

質問

辞書に指定されたキーの値が含まれていない場合のみ false を返すのでしょうか、それとも別のスレッドが何かを追加/更新するようなスレッド レース条件によって false も返すのでしょうか?

コードでの質問です。

ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>();

// This might fail if another thread is adding with key value of 1.
cd.TryAdd(1, "one"); 

// Will this ever fail if no other thread ever removes with the key value of 1?
cd.TryRemove(1); 

編集します。 私はそれが与えられたキーに対応する値を含まない場合のみfalseを返すと思いますが、絶対に確認したいです。

どのように解決するには?

一方 ミッチーが正しい というのは ConcurrentDictionary がレースコンディションに対して脆弱でないということは、あなたが質問している答えとしては、キーが存在する場合はイエスであると思います。 TryRemove は動作し true .

投稿されたコードでは、まさか TryRemove が返されるわけがありません。 false を返すので cd は他のどこにもアクセスされないローカル変数だからです。しかし、もしどこかのコードがこの ConcurrentDictionary オブジェクトへの参照を与えられ、別のスレッドでキーを削除していたとしたら、それは TryRemovefalse を返すかもしれない、ここでも -- しかし はキーがすでに削除されているため 他のアクションがディクショナリに対して実行され、キーが何らかの形でそこで "stuck"されたためではありません。