4 votes

Défense contre les conditions de course dans System.Collections.Concurrent.ConcurrentDictionary

Le ConcurrentDictionary de .NET est sensible à une condition de course qui peut entraîner des données inattendues, comme expliqué ci-après. au bas de cet article MSDN. Je suppose qu'il y a plusieurs facteurs à prendre en compte.

Q : Comment dois-je écrire un code qui ne soit pas vulnérable à cette condition de course qui peut entraîner une perte de données ?

Dans mon scénario, j'ai un flux d'entrée qui a un index toujours croissant (n++). Je pense que je pourrais détecter les données manquantes si la condition de course se produit et le renvoie. D'un autre côté, il existe peut-être une meilleure façon de procéder dont je ne suis pas au courant.

8voto

Tudor Points 39539

Il existe un piège général avec les collections concurrentes (qui ne se limite pas à .net) dont les gens doivent être conscients, à savoir que les opérations individuelles peuvent être thread-safe, mais les séquences d'opérations ne sont pas atomiques . Ce que je veux dire par là est le suivant : supposons ce scénario, où j'ai une collection concurrente avec une Check et un Add opération, toutes deux atomiques.

Ce que je veux faire, c'est vérifier si une valeur existe et si non, l'ajouter. Je peux donc écrire ceci :

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

Bien que les deux opérations soient atomiques, la séquence ci-dessus ne l'est pas, car un thread peut être interrompu entre la vérification et l'ajout par un autre thread, ce qui entraîne des résultats incohérents. Ainsi, la séquence entière devrait être rendue atomique en l'enveloppant dans un fichier lock par exemple.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X