1

を使用するクラスがありますConcurrentDictionary

このクラスには、 this に対していくつかの操作を実行する 3 つの関数がありますConcurrentDictionnary

各関数は、異なるスレッドによって呼び出されます。

  • 最初の関数操作: dictionnary.Where、dictionnary.TryRemove
  • 2 番目の関数操作: dictionnary.Where
  • 3 番目の関数操作: dictionnary.TryAdd

while (!dictionnaryKey.TryAdd(key, item))
{
  LogWriter.error_log("try add to dictionnary ...");
}

この最後の関数は、さまざまな時点でブロックされます。ブロックせずに要素を辞書に追加する必要がありますが、どうすればよいですか?

4

1 に答える 1

1
I have to add my element to the dictionary without blocking, but how can I do?

それは不可能です。ConcurrentDictionary は、マルチスレッドと低競合向けに最適化されていますが、それでも競合 (ブロッキング) がないわけではありません。ConcurrentDictionary のすべての書き込み操作は、きめの細かいロックモデルを使用し、複数のロック オブジェクトを内部で使用して書き込み操作を同期し、データの一貫性を保ち、マルチスレッドの例外を防ぎます。

ロックTryAdd(別のスレッドによって取得された)が解放されるのを待っているため、メソッドは明らかにブロックされています。

並行辞書列挙 (Where操作など) がブロックされない理由は、それらがロックフリーモデルを使用しているためです。

ConcurrentDictionary の代わりにプレーンな古いディクショナリを使用しても、パフォーマンス上の利点は得られません。読み取り/書き込みロックを使用して自分でロックを処理する必要があるからです。

@Usr がコメントで述べたように、複数のライターのシナリオで単一の ConcurrentDictionary を使用するという概念全体よりも、非ブロッキング処理を行うことが目標である場合は、間違っている可能性があります。

于 2014-10-17T09:56:42.217 に答える