2013-12-13 2 views
4

모노 구현에는 ReaderWriterLockSlim 메서드 내에서 MemoryBarrier 호출이 없습니다. 따라서 write lock 내부에서 변경을 수행하면 read lock을 사용하는 다른 스레드에서 오래된 캐시 된 값을 수신 할 수 있습니다.ReaderWriterLockSlim과 함께 MemoryBarrier가 필요합니까?

정말 가능합니까? 코드 앞뒤에 MemoryBarrier을 삽입해야합니까?

답변

5

(내 생각 엔) the mono source, 모노ReaderWriterLockSlim은 (는) Interlocked 호출을 사용하여 구현됩니다.

이 전화는 include a memory barrier on x86이므로 추가 할 필요가 없습니다.

+1

메모리 장벽이없는 CAS가있는 CPU가 있지만 꽤 희귀합니다. 메모리 장벽이있는 CAS 폼도 있지만 실제로 궁극적 인 동시성을 원할 때가없는 CAS도 있다고 생각합니다. –

2

피터가 올바르게 지적했듯이, 구현은 명시 적으로가 아니라 메모리 장벽을 도입합니다.

보다 일반적으로 : C# 언어 사양에서는 특정 부작용이 잠금과 관련하여 잘 정렬되어야합니다. 이 규칙은 C# lock 문으로 입력 된 잠금에만 적용되지만 사용자 지정 잠금 프리미티브 공급자가 동일한 규칙을 따르지 않는 잠금 개체를 만드는 것은 매우 이상합니다. 두 번 확인하는 것이 현명합니다. 그러나 일반적으로 스레딩 프리미티브가 중요한 부작용을 효과적으로 처리 할 수 ​​있도록 설계되었습니다.

관련 문제