Je dois créer une collection de collections. La collection est appelée par plusieurs threads pour ajouter des éléments et des éléments de recherche. Une fois ajoutés, les éléments ne seront pas supprimés. Actuellement, tout en ajoutant des éléments, je dois prendre un verrou sur l'ensemble de la collection. Y a-t-il un moyen de le contourner pour le rendre verrouillé? Ou y a-t-il une meilleure infrastructure de données ou un modèle que je peux utiliser? Voici une version simplifiée de mon code:Comment créer une collection de collection 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' n'est pas lockfree. –
Sure ConcurrentDictionary est threadsafe mais dans ce cas il n'est pas sûr d'ajouter de nouvelles clés au dictionnaire 'dict'. Par exemple, si mes appels ressemblent à Task.Factory.StartNew (() => AddUpdateItem ('a', 1, 2)); Task.Factory.StartNew (() => AddUpdateItem ('a', 3, 2)); il ne serait pas sécuritaire d'ajouter des éléments sans verrouiller. – 123
Je faisais juste référence à TryAdd. Comme mentionné dans l'article, GetOrAdd et AddOrUpdate ne sont pas atomiques. Votre AddUpdateItem tombe sous AddorUpdate? – Jagannath