Garantir la sécurité des threads avec le générateur de nombres aléatoires de C#
La méthode Random.Next()
intégrée de C# n’est pas thread-safe. Son utilisation dans des applications multithread peut conduire à des résultats incorrects en raison de conditions de concurrence. Heureusement, créer une version thread-safe est simple.
Un générateur de nombres aléatoires thread-safe
La classe ThreadSafeRandom
suivante fournit une solution utilisant des variables statiques de thread pour garantir la sécurité des threads. Chaque thread obtient sa propre Random
instance indépendante.
<code class="language-csharp">public class ThreadSafeRandom { private static readonly Random _global = new Random(); [ThreadStatic] private static Random _local; public int Next() { if (_local == null) { int seed; lock (_global) { seed = _global.Next(); } _local = new Random(seed); } return _local.Next(); } }</code>
Gestion des graines pour des nombres aléatoires uniques
Un problème courant avec plusieurs Random
instances est de générer des nombres similaires ou identiques, en particulier lorsqu'elles sont créées en succession rapide. Cette implémentation résout ce problème en utilisant une instance Random
globale (_global
) pour générer des graines uniques pour chaque instance Random
locale du thread (_local
). La déclaration lock
empêche les conditions de concurrence lors de l'accès au Random
global pour la génération de graines.
Cette méthode garantit des graines distinctes pour chaque fil, ce qui donne lieu à des séquences de nombres véritablement aléatoires et indépendantes. Les développeurs peuvent désormais utiliser en toute sécurité la génération de nombres aléatoires dans les applications multithread, évitant ainsi les pièges des approches non thread-safe.
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!