コレクションのコレクションを作成する必要があります。コレクションは、アイテムとルックアップアイテムを追加するために複数のスレッドによって呼び出されます。追加されたアイテムは削除されません。現在、要素を追加しているうちにコレクション全体をロックする必要があります。それをロックフリーにする方法がありますか?または、私が使用できるより良いデータ構造またはパターンがありますか?ここ は、私のコードの簡易版である:Lockfreeコレクションの作成方法
readonly ConcurrentDictionary<string, ConcurrentDictionary<int, int>> dict = new ConcurrentDictionary<string, ConcurrentDictionary<int, int>>();
void AddUpdateItem(string s, int k, int v)
{
ConcurrentDictionary<int, int> subDict;
if (dict.TryGetValue(s, out subDict))
{
subDict[k] = v;
}
else
{
lock (dict)
{
if (dict.TryGetValue(s, out subDict))
{
subDict[k] = v;
}
else
{
subDict = new ConcurrentDictionary<int, int>();
subDict[k] = v;
dict[s] = subDict;
}
}
}
}
'ConcurrentDictionary'はロックフリーではありません。 –
確かにConcurrentDictionaryはスレッドセーフですが、この場合、新しいキーを 'dict'辞書に追加することは安全ではありません。たとえば、私の呼び出しが のように見える場合Task.Factory.StartNew(()=> AddUpdateItem( 'a'、1、2)); Task.Factory.StartNew(()=> AddUpdateItem( 'a'、3,2)); ロックを取ることなく項目を追加するのはスレッドセーフではありません。 – 123
私はちょうどTryAddを参照していました。この記事で触れたように、GetOrAddとAddOrUpdateはアトミックではありません。 AddUpdateItemはAddorUpdateの下にありますか? – Jagannath