Maison >développement back-end >C++ >Random.Next() de C# est-il thread-safe et comment pouvez-vous créer une alternative thread-safe ?

Random.Next() de C# est-il thread-safe et comment pouvez-vous créer une alternative thread-safe ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-21 02:51:17850parcourir

Is C#'s Random.Next() Thread-Safe, and How Can You Create a Thread-Safe Alternative?

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

La classe

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn