Thread-Sicherheit des C#-Zufallszahlengenerators
Ist die Methode in C# threadsicher und ermöglicht die gleichzeitige Verwendung mehrerer Threads? Die Antwort ist leider nein. Die Verwendung derselben Instanz in mehreren Threads kann zu Datenbeschädigungen führen, die sich durch die Rückgabe aufeinanderfolgender Nullen bemerkbar machen. Random.Next()
Aufruf eine umständliche Sperre zu verwenden. Basierend auf Konzepten, die in einem aufschlussreichen Artikel vorgestellt wurden, bieten wir eine Lösung: 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>
Instanz zu verwalten. Aber selbst diese einfache Implementierung birgt eine weitere Gefahr. Wenn mehrere Instanzen innerhalb eines kurzen Zeitraums (ca. 15 Millisekunden) initialisiert werden, verwenden sie standardmäßig dieselbe Reihenfolge. Um dieses Problem zu lösen, führen wir eine globale statische Random
-Instanz ein, die speziell zum Generieren von Seeds für jeden Thread verwendet wird. Random
in C# bietet. Random
Das obige ist der detaillierte Inhalt vonIst Random.Next() von C# threadsicher und wie können wir es so machen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!