Alternatives HashSet Thread-Safe dans .NET Framework
Le .NET Framework standard HashSet<T>
n'est pas thread-safe. L'accès simultané peut provoquer un comportement imprévisible. Explorons des solutions pour les opérations thread-safe.
Verrouillage manuel (votre approche) :
Votre méthode utilise les instructions lock
pour synchroniser l'accès au HashSet<string>
. Cela fonctionne, mais ajoute une surcharge de performances en raison du verrouillage explicite pour chaque opération.
Options supérieures Thread-Safe :
.NET n'a pas de ConcurrentHashSet<T>
direct, mais des alternatives viables existent :
ConcurrentDictionary<TKey, TValue>
:
C'est un concurrent sérieux. Puisque vous n'avez besoin que de la clé (chaîne), vous pouvez utiliser un ConcurrentDictionary<string, byte>
où la valeur byte
est essentiellement un espace réservé.
<code class="language-csharp">private ConcurrentDictionary<string, byte> _data = new ConcurrentDictionary<string, byte>();</code>
Implémentation ConcurrentHashSet<T>
personnalisée :
Vous pouvez créer votre propre HashSet thread-safe. L'exemple de code utilise probablement ReaderWriterLockSlim
pour une gestion efficace des opérations de lecture et d'écriture, minimisant ainsi les conflits.
ConcurrentBag<T>
(à éviter généralement) :
ConcurrentBag<T>
convient aux modèles producteur-consommateur, et non à l'ajout et à la suppression précis d'éléments. Ce n'est pas recommandé pour ce cas d'utilisation.
Choisir la bonne approche :
Le meilleur choix dépend des besoins en performances, de la complexité de la mise en œuvre et des attentes en matière de fiabilité. Dans la plupart des cas, ConcurrentDictionary<string, byte>
offre un bon équilibre entre simplicité et performances. Une implémentation personnalisée offre plus de contrôle mais nécessite plus d'efforts. Évitez ConcurrentBag<T>
pour ce scénario spécifique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!