Thread-Sicherheitsgarantie bei der C#-Zufallszahlengenerierung
In Multithread-Anwendungen ist es wichtig sicherzustellen, dass kritische Ressourcen oder Methoden Thread-sicher sind. In C# ist die Thread-Sicherheit der Random.Next()
-Methode des häufig verwendeten Tools zur Zufallszahlengenerierung besorgniserregend.
Ist der Zufallszahlengenerator von C# threadsicher?
Nein, die gleichzeitige Verwendung von Random.Next()
aus mehreren Threads ist nicht threadsicher. Dies kann zu unvorhersehbarem Verhalten und möglicherweise falschen Ergebnissen führen. Die Hauptursache des Problems besteht darin, dass möglicherweise mehrere Threads gleichzeitig versuchen, den internen Status derselben Random
-Instanz zu ändern, was dazu führt, dass der Wert beschädigt wird oder sogar vollständig fehlschlägt und nur 0 zurückgibt.
Erstellen Sie einen Thread-sicheren Zufallszahlengenerator
Während Random.Next()
selbst nicht threadsicher ist, ist es möglich, eine threadsichere Version zu erstellen, ohne für jeden Methodenaufruf einen komplexen Sperrmechanismus zu verwenden. Durch die Nutzung einer in einem externen Artikel beschriebenen Technik können wir eine benutzerdefinierte ThreadSafeRandom
-Klasse implementieren:
<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>
Erklärung
DieThreadSafeRandom
-Klasse gewährleistet Thread-Sicherheit, indem sie für jeden Thread eine separate Random
-Instanz verwaltet. Dadurch wird verhindert, dass Threads den internen Status des anderen stören. Allerdings gibt es einen Vorbehalt: Das Erstellen mehrerer Instanzen von Random
in unmittelbarer Nähe (innerhalb von etwa 15 Millisekunden) kann zu derselben Folge von Zufallszahlen führen. Um dieses Problem zu lösen, führen wir eine globale statische Random
-Instanz (_global
) ein, die verwendet wird, um den Startwert für die lokale Random
-Instanz (_local
) jedes Threads zu generieren.
Das obige ist der detaillierte Inhalt vonIst die „Random.Next()'-Methode von C# threadsicher und wie können wir eine threadsichere Alternative erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!