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

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

Linda Hamilton
풀어 주다: 2025-01-21 02:35:09
원래의
874명이 탐색했습니다.

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

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

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