4

.NET ConcurrentDictionary は競合状態の影響を受けやすく、この MSDN 記事の下部で説明されているように、予期しないデータが発生する可能性があります。 考慮すべきいくつかの要因があると思います。

Q:データの損失を引き起こす可能性のある競合状態に対して脆弱でないコードをどのように記述すればよいですか?

私のシナリオでは、常に増加するインデックス (n++) を持つ入力ストリームがあります。私の考えでは、競合状態が発生した場合に欠落データを検出して再送信できると考えています。一方で、私が気付いていない、これを行うためのより良い方法があるかもしれません。

4

1 に答える 1

8

並行コレクション (.net に限定されない) には一般的な落とし穴があります。これは、個々の操作はスレッドセーフである可能性がありますが、一連の操作はアトミックではないということです。これが意味することは次のとおりです。このシナリオを想定します。ここでは、同時コレクションとCheck操作Addがあり、両方ともアトミックです。

私がやりたいことは、値が存在するかどうかを確認し、存在しない場合は追加することです。だから私はこれを書くことができます:

if(!collection.Check(value)) 
{
    collection.Add(value);
}

両方の操作はアトミックですが、上記のシーケンスはアトミックではありません。チェックと追加の間で別のスレッドによってスレッドが割り込まれ、一貫性のない結果が生じる可能性があるためです。lockしたがって、たとえばステートメントでラップすることにより、シーケンス全体をアトミックにする必要があります。

lock(locker)
{
   if(!collection.Check(value)) 
   {
       collection.Add(value);
   }
}
于 2012-05-12T16:49:55.600 に答える