Programing

Interlocked.Exchange가 부울 유형을 지원하지 않는 이유는 무엇입니까?

lottogame 2020. 12. 2. 07:42
반응형

Interlocked.Exchange가 부울 유형을 지원하지 않는 이유는 무엇입니까?


.NET 팀이 Interlocked.Exchange 작업에서 Boolean을 지원하지 않기로 결정한 실용적인 이유가 있습니까?

사용 예 중 하나는 일부 코드가 한 번만 실행되도록 보장하고이를 위해 부울 플래그를 사용하려는 경우입니다.


네, 좋은 이유가 있습니다. Interlocked 메서드를 구현하려면 프로세서 수준에서 낮은 수준의 지원이 필요합니다. 예를 들어이 답변참조하십시오 . 이는 아키텍처에 구애받지 않는 프레임 워크를 정의 할 때 문제가됩니다.

기본 프로세서 단어 크기의 일부인 데이터 유형에 대해 Interlocked 클래스가 지원하는 로우 락 기술을 구현하는 것은 어렵습니다. 10 년 이상 전에 인기를 끌었던 CPU 설계에 대한 RISC 접근 방식은이를 강력히 막았습니다. 피연산자 크기와 기본 메모리 버스 너비가 일치하지 않아 구현하기가 매우 어렵습니다. 인텔의 x86 아키텍처가 여전히 당신의 무릎 위에있는 한 가지 이유는 바로 가기를 사용하지 않고 이미 30 년을 살아 남았습니다. wikipedia 기사 에서 RISC에 대한 자세한 배경 정보 .


질문에 대답하지 않지만 해결 방법으로 C처럼 bool 대신 int를 사용할 수 있습니다.

    int m_IsFirstTime = 1; // 1 means true 0 means false. 

    void SomeMethod()
    {
        if (1 == Interlocked.Exchange(ref m_IsFirstTime , 0))
            // Do something for the first time.

        else
            // Do something for all other times.

    }

추신 : 읽기가 쓰기보다 빠르다는 증거가 있다면 Interlocked.CompareExchange 가이 경우에 더 좋을 수 있습니다 (처음 한 번만 사용하고 많은 것을 먼저 가정합니다).

참고 URL : https://stackoverflow.com/questions/6164751/why-does-interlocked-exchange-not-support-boolean-type

반응형