C# 난수 생성기의 스레드 안전 문제
소프트웨어 개발에서는 멀티 스레드 환경에서 공유 리소스에 대한 안전한 액세스를 보장하는 것이 중요합니다. C#의 Random.Next()
메서드는 난수를 생성하는 데 사용되지만 스레드 안전성은 살펴볼 가치가 있습니다.
Random.Next()
은 스레드로부터 안전합니까?
아니요. 여러 스레드가 동일한 Random.Next()
인스턴스를 동시에 사용하는 경우 예측할 수 없는 동작이 발생할 수 있으며 일련의 0 값이 발생할 수도 있습니다.
스레드로부터 안전한 난수 생성기 만들기
Random
클래스의 스레드로부터 안전한 버전을 생성하려면 다음 접근 방식을 권장합니다.
<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>
작동 방식:
이 클래스는 각 스레드에 대해 고유한 정적 Random
인스턴스를 유지하여 스레드 안전성을 달성합니다. 새 스레드가 이 클래스에 액세스하면 전역 Random
인스턴스에서 시드 값을 생성하여 스레드별로 시퀀스가 고유하도록 합니다.
Random
의 사소한 문제 해결
Random
클래스에도 기능이 있습니다. 짧은 시간(15밀리초 이내) 내에 여러 인스턴스가 생성되면 동일한 시퀀스를 반환할 수 있습니다. 이 문제를 완화하려면 전역 Random
인스턴스를 사용하여 시드를 생성하여 충돌을 방지하세요.
결론:
C#의 스레드 안전성 제한을 이해하고Random.Next()
스레드로부터 안전한 버전을 구현하면 멀티스레드 애플리케이션에서 안정적인 난수 생성을 보장할 수 있습니다.
위 내용은 C#의 Random.Next()는 스레드로부터 안전하며 스레드로부터 안전한 대안을 어떻게 만들 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!