Sécurité des threads du générateur de nombres aléatoires C#
La méthode en C# est-elle thread-safe et permet-elle d'utiliser plusieurs threads simultanément ? La réponse est malheureusement non. L'utilisation de la même instance dans plusieurs threads peut entraîner une corruption des données, se manifestant par le renvoi de 0 consécutifs. Random.Next()
appel. En nous appuyant sur des concepts présentés dans un article éclairant, nous proposons une solution : Next()
<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>
statique distincte pour chaque thread. Mais même cette simple mise en œuvre se heurte à un autre écueil. Lorsque plusieurs instances sont initialisées sur une courte période (environ 15 millisecondes), elles suivent par défaut la même séquence. Pour résoudre ce problème, nous introduisons une instance statique globale Random
spécifiquement utilisée pour générer des graines pour chaque thread. Random
en C#. Random
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!