Thread-Sicherheitsprobleme im C#-Zufallszahlengenerator
Bei der Softwareentwicklung ist die Gewährleistung eines sicheren Zugriffs auf gemeinsam genutzte Ressourcen in einer Multithread-Umgebung von entscheidender Bedeutung. Die Random.Next()
-Methode von C# wird zum Generieren von Zufallszahlen verwendet, aber ihre Thread-Sicherheit ist es wert, untersucht zu werden.
Random.Next()
threadsicher?
Nein. Wenn mehrere Threads gleichzeitig dieselbe Random.Next()
-Instanz verwenden, kann dies zu unvorhersehbarem Verhalten und möglicherweise sogar zu einer Reihe von Nullwerten führen.
Erstellen Sie einen Thread-sicheren Zufallszahlengenerator
Um eine Thread-sichere Version der Random
-Klasse zu erstellen, wird der folgende Ansatz empfohlen:
<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>
So funktioniert es:
Diese Klasse erreicht Thread-Sicherheit, indem sie für jeden Thread eine eindeutige statische Random
Instanz verwaltet. Wenn ein neuer Thread auf diese Klasse zugreift, generiert er einen Startwert aus der globalen Random
-Instanz und stellt so sicher, dass die Sequenz pro Thread eindeutig ist.
Kleinere Probleme von Random
gelöst
Random
-Klasse verfügt außerdem über eine Funktion: Wenn mehrere Instanzen innerhalb eines kurzen Zeitraums (innerhalb von 15 Millisekunden) erstellt werden, können sie dieselbe Sequenz zurückgeben. Um dieses Problem zu mildern, verwenden Sie globale Random
-Instanzen, um Seeds zu generieren und so Konflikte zu vermeiden.
Fazit:
Das Verständnis der Thread-Sicherheitseinschränkungen von C# Random.Next()
und die Implementierung einer Thread-sicheren Version können eine zuverlässige Zufallszahlengenerierung in Multithread-Anwendungen gewährleisten.
Das obige ist der detaillierte Inhalt vonIst Random.Next() von C# Thread-sicher und wie können Sie eine Thread-sichere Alternative erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!