Maison >développement back-end >C++ >Random.Next() de C# est-il thread-safe et comment pouvez-vous créer une alternative thread-safe ?
Problèmes de sécurité des threads dans le générateur de nombres aléatoires C#
Dans le développement de logiciels, garantir un accès sécurisé aux ressources partagées dans un environnement multithread est crucial. La méthode Random.Next()
de C# est utilisée pour générer des nombres aléatoires, mais sa sécurité des threads mérite d'être explorée.
Random.Next()
est-il thread-safe ?
Non. Si plusieurs threads utilisent la même Random.Next()
instance en même temps, cela peut conduire à un comportement imprévisible et éventuellement même à une série de valeurs nulles.
Créez un générateur de nombres aléatoires thread-safe
Afin de créer une version thread-safe de la classe Random
, l'approche suivante est recommandée :
<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>
Comment ça marche :
Cette classe assure la sécurité des threads en conservant une instance Random
statique unique pour chaque thread. Lorsqu'un nouveau thread accède à cette classe, il génère une valeur de départ à partir de l'instance globale Random
, garantissant que la séquence est unique par thread.
Résolu les problèmes mineurs de Random
Random
possède également une fonctionnalité : si plusieurs instances sont créées dans un court laps de temps (dans les 15 millisecondes), elles peuvent renvoyer la même séquence. Pour atténuer ce problème, utilisez des instances globales Random
pour générer des graines afin d'éviter les conflits.
Conclusion :
Comprendre les limitations de sécurité des threads de C# Random.Next()
et implémenter une version thread-safe peut garantir une génération fiable de nombres aléatoires dans les applications multithread.
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!