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 중국어 웹사이트의 기타 관련 기사를 참조하세요!