C# 난수 생성 시 스레드 안전성 보장
멀티 스레드 애플리케이션에서는 중요한 리소스나 메서드가 스레드로부터 안전한지 확인하는 것이 중요합니다. C#에서는 일반적으로 사용되는 난수 생성 도구의 Random.Next()
메서드의 스레드 안전성이 우려됩니다.
C#의 난수 생성기는 스레드로부터 안전합니까?
아니요, 동시에 여러 스레드에서 Random.Next()
을 동시에 사용하는 것은 스레드로부터 안전하지 않습니다. 이로 인해 예측할 수 없는 동작이 발생하고 잘못된 결과가 발생할 수 있습니다. 문제의 근본 원인은 여러 스레드가 동시에 동일한 Random
인스턴스의 내부 상태를 수정하려고 시도하여 값이 손상되거나 완전히 실패하여 0만 반환될 수 있다는 것입니다.
스레드로부터 안전한 난수 생성기 만들기
Random.Next()
자체는 스레드로부터 안전하지 않지만 모든 메소드 호출에 복잡한 잠금 메커니즘을 사용하지 않고도 스레드로부터 안전한 버전을 생성할 수 있습니다. 외부 기사에 설명된 기술을 활용하여 사용자 정의 ThreadSafeRandom
클래스를 구현할 수 있습니다:
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(); } }
설명
ThreadSafeRandom
클래스는 각 스레드에 대해 별도의 Random
인스턴스를 유지하여 스레드 안전성을 보장합니다. 이는 스레드가 서로의 내부 상태를 간섭하는 것을 방지합니다. 그러나 주의할 점은 매우 가까운 거리(약 15밀리초 이내)에서 Random
의 여러 인스턴스를 생성하면 동일한 난수 시퀀스가 생성될 수 있다는 것입니다. 이 문제를 해결하기 위해 각 스레드의 로컬 Random
인스턴스(_global
)에 대한 시드 값을 생성하는 데 사용되는 전역 정적 Random
인스턴스(_local
)를 도입합니다.
위 내용은 C#의 `Random.Next()` 메서드는 스레드로부터 안전하며 스레드로부터 안전한 대안을 어떻게 만들 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!