Ai-je raison de penser qu'il s'agit là de l'utilisation correcte d'un dictionnaire concurrent ?
private ConcurrentDictionary<int,long> myDic = new ConcurrentDictionary<int,long>();
//Main thread at program startup
for(int i = 0; i < 4; i++)
{
myDic.Add(i, 0);
}
//Separate threads use this to update a value
myDic[InputID] = newLongValue;
Je n'ai pas de verrous, etc. et je ne fais que mettre à jour la valeur dans le dictionnaire, même si plusieurs threads peuvent essayer de faire la même chose.
2 votes
Cela dépend - est-ce que
newLongValue
dépendent de la valeur précédente demyDic[InputID]
?3 votes
Vous devez éviter d'accéder directement par la clé
myDic[InputID]
pour une condition de course. Vous devez essayerGetOrAdd
3 votes
@OlivierAlbertini, je ne pense pas que
myDic[InputID]
ne pose aucun problème lorsqu'il est utilisé comme une valeur l.GetOrAdd
n'est pas un remplacement correct puisqu'il ajoute seulement si la valeur n'existe pas. Nous pouvons utiliser à la placeAddOrUpdate
pour ajouter/mettre à jour la même valeur dans le dictionnaire.0 votes
@JatinSanghvi Vieille réponse ici, mais je veux dire que oui, l'utilisation de l'accesseur directement comme cela pose des problèmes car il contourne les opérations atomiques. Comme indiqué dans la documentation : "Stocker une paire clé/valeur dans le dictionnaire sans condition, et écraser la valeur d'une clé qui existe déjà". Le mot clé est inconditionnellement, il n'y a aucun intérêt à utiliser un dictionnaire concurrent si vous évitez la fonctionnalité concurrente/atomique lors de la mise à jour.