J'ai une situation en C# où j'ai une liste de types simples. Cette liste peut être accédée par plusieurs threads: des entrées peuvent être ajoutées ou supprimées, et l'existence d'une entrée peut être vérifiée. J'ai encapsulé la liste dans un objet exposant seulement ces trois opérations jusqu'ici.C# Concurrent List Questions
J'ai quelques cas à gérer (pas exactement les mêmes que les méthodes que je viens de mentionner).
1. Un thread peut simplement vérifier l'existence d'une entrée. (simple)
2. Un thread peut vérifier l'existence d'une entrée et, si elle n'existe pas, l'ajouter.
3. Un thread doit vérifier si une entrée existe et, le cas échéant, attendre qu'il soit supprimé.
4. Une combinaison de 2 et 3, où un thread vérifie l'existence d'une entrée, s'il existe, il doit attendre jusqu'à ce qu'il soit supprimé avant de pouvoir l'ajouter lui-même.
L'idée générale est que l'existence d'une entrée signifie un verrou. Si une entrée existe, l'objet identifié ne peut pas être modifié et le code ne peut pas continuer car il est modifié ailleurs. Cela peut sembler être de simples situations novices mais je me rafraîchis sur les problèmes de simultanéité et cela me rend un peu paranoïaque, et je ne suis pas aussi familier avec les mécanismes de simultanéité de C#.
Quelle serait la meilleure façon de gérer cela? Suis-je totalement éteint? Devrait vérifier et ajouter (tester et définir?) Être combinés dans une quatrième opération atomique? Aurais-je simplement ajouter des blocs de verrouillage à mes méthodes d'accès à la liste?
Aussi, est-il possible de tester ce type de chose (pas les opérations simples, les situations de concurrence)?
+1, je suis venu à une solution similaire, mais le HashSet rend plus efficace. Belle démonstration pour la classe Monitor, en utilisant des Locks imbriqués, etc. Seul le problème pourrait être un 'stampede' quand un élément est enlevé. –