> 백엔드 개발 > C++ > C#의 Random.Next()는 스레드로부터 안전한가요? 어떻게 그렇게 만들 수 있나요?

C#의 Random.Next()는 스레드로부터 안전한가요? 어떻게 그렇게 만들 수 있나요?

Barbara Streisand
풀어 주다: 2025-01-21 02:46:13
원래의
190명이 탐색했습니다.

Is C#'s Random.Next() Thread-Safe, and How Can We Make It So?

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

위에 언급된 문서에서는 이러한 고려 사항을 모두 자세히 설명하는 코드 예시를 제공하고 C#에서

의 복잡성에 대한 심층적인 지침을 제공합니다. Random

위 내용은 C#의 Random.Next()는 스레드로부터 안전한가요? 어떻게 그렇게 만들 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿