C# 乱数生成器のスレッド セーフ
C# の メソッドはスレッドセーフであり、複数のスレッドを同時に使用できますか?答えは残念ながらノーです。複数のスレッドで同じインスタンスを使用すると、連続した 0 が返されるなど、データ破損が発生する可能性があります。 Random.Next()
呼び出しごとに面倒なロックを使用せずに、スレッドセーフなバリアントを作成することができます。啓発的な記事で紹介されている概念に基づいて、次のソリューションを提供します。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>
インスタンスを維持することです。しかし、この単純な実装でも別の落とし穴に直面します。複数のインスタンスが短期間 (約 15 ミリ秒) 内に初期化される場合、それらはデフォルトで同じシーケンスになります。この問題を解決するために、各スレッドのシードを生成するために特別に使用されるグローバル静的 Random
インスタンスを導入します。 Random
の複雑さについての詳細なガイダンスを提供します。 Random
以上がC# の Random.Next() はスレッドセーフですか?また、どうすればスレッドセーフにできるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。