Program Tip

연동 및 휘발성

programtip 2020. 11. 15. 11:40
반응형

연동 및 휘발성


상태를 나타내는 데 사용하는 변수가 있습니다. 여러 스레드에서 읽고 쓸 수 있습니다.

나는 그것을 사용 Interlocked.Exchange하고 Interlocked.CompareExchange있습니다. 그러나 여러 스레드에서 읽고 있습니다.

volatile변수가 로컬로 캐시되지 않고 항상 메모리에서 직접 읽도록하는 데 사용할 수 있다는 것을 알고 있습니다.

그러나 변수를 volatile로 설정하면 volatile을 사용하고 참조를 사용하여 Interlocked 메서드에 전달하는 것에 대한 경고가 생성됩니다.

각 스레드가 캐시 된 버전이 아닌 변수의 최신 값을 읽고 있는지 확인하고 싶지만 휘발성을 사용할 수 없습니다.

Interlocked.Read있지만 64 비트 유형용이며 컴팩트 프레임 워크에서는 사용할 수 없습니다. 이에 대한 문서에 따르면 32 비트 유형에는 이미 단일 작업으로 수행되므로 필요하지 않습니다.

모든 액세스에 Interlocked 방법을 사용하는 경우 변동성이 필요하지 않다는 진술이 인터넷을 통해 작성되었습니다. 그러나 Interlocked 메서드를 사용하여 32 비트 변수를 읽을 수 없으므로 모든 액세스에 대해 Interlocked 메서드를 사용할 수있는 방법이 없습니다.

잠금을 사용하지 않고 내 변수의 스레드 안전 읽기 및 쓰기를 수행하는 방법이 있습니까?


Interlocked.Xxx함수 항상 휘발성 작업을 수행하므로 함수를 사용할 때이 경고를 무시해도됩니다 ( 이 질문 참조 ). 따라서 volatile변수는 공유 상태에 대해 완벽하게 괜찮습니다. 당신이 모든 비용에 경고를 제거하려는 경우, 당신은 실제로 와 연동 읽기를 할 Interlocked.CompareExchange (ref counter, 0, 0).

편집 : 사실, 직접 쓰려는 경우 에만volatile 상태 변수 가 필요 합니다 (예 : 사용하지 않음 ). jerryjvl이 언급했듯이 연동 된 (또는 휘발성) 작업으로 업데이트 된 변수의 읽기는 가장 최근 값을 사용합니다.Interlocked.Xxx


연동 작업과 휘발성은 실제로 동시에 사용해서는 안됩니다. 경고를받는 이유는 (거의?) 항상 자신이하는 일을 오해했음을 나타 내기 때문입니다.

지나치게 단순화 및 패러 프레이징 :
volatile변수를 업데이트하는 다른 스레드가있을 수 있으므로 모든 읽기 작업이 메모리에서 다시 읽어야 함을 나타냅니다. 실행중인 아키텍처에서 원자 적으로 읽고 쓸 수있는 필드에 적용 할 때 long / ulong을 사용하지 않는 한이 작업 만 수행하면됩니다. 대부분의 다른 유형은 원자 적으로 읽고 쓸 수 있습니다.

필드가 휘발성으로 표시되지 않은 경우 Interlocked작업을 사용하여 유사한 보장을 할 수 있습니다 . 캐시가 플러시되어 다른 모든 프로세서에 업데이트가 표시되기 때문입니다. 이것은 오버 헤드를 발생시키는 이점이 있습니다. 읽기보다는 업데이트.

이 두 가지 접근 방식 중 어느 것이 가장 잘 수행되는지는 정확히 무엇을하고 있는지에 따라 다릅니다. 그리고이 설명은 지나치게 단순화 된 것입니다. 그러나 동시에 두 가지를 모두 수행하는 것은 무의미하다는 것이 분명합니다.

참고 URL : https://stackoverflow.com/questions/1186515/interlocked-and-volatile

반응형