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
'Programing' 카테고리의 다른 글
Websocket 서버 : 웹 소켓의 onopen 함수가 호출되지 않습니다. (0) | 2020.12.02 |
---|---|
git을 사용하여 마스터에서 브랜치로 커밋 이동 (0) | 2020.12.02 |
Datomic은 언제 사용해야합니까? (0) | 2020.12.02 |
MismatchSenderId를받는 FCM (0) | 2020.12.02 |
WPF XAML StringFormat DateTime : 잘못된 문화권의 출력? (0) | 2020.12.02 |