>백엔드 개발 >C++ >C#의 Random.Next()는 스레드로부터 안전하며 스레드로부터 안전한 대안을 어떻게 만들 수 있습니까?

C#의 Random.Next()는 스레드로부터 안전하며 스레드로부터 안전한 대안을 어떻게 만들 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-21 02:51:17808검색

Is C#'s Random.Next() Thread-Safe, and How Can You Create a Thread-Safe Alternative?

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.