모노 구현에는 ReaderWriterLockSlim
메서드 내에서 MemoryBarrier
호출이 없습니다. 따라서 write lock
내부에서 변경을 수행하면 read lock
을 사용하는 다른 스레드에서 오래된 캐시 된 값을 수신 할 수 있습니다.ReaderWriterLockSlim과 함께 MemoryBarrier가 필요합니까?
정말 가능합니까? 코드 앞뒤에 MemoryBarrier
을 삽입해야합니까?
모노 구현에는 ReaderWriterLockSlim
메서드 내에서 MemoryBarrier
호출이 없습니다. 따라서 write lock
내부에서 변경을 수행하면 read lock
을 사용하는 다른 스레드에서 오래된 캐시 된 값을 수신 할 수 있습니다.ReaderWriterLockSlim과 함께 MemoryBarrier가 필요합니까?
정말 가능합니까? 코드 앞뒤에 MemoryBarrier
을 삽입해야합니까?
(내 생각 엔) the mono source, 모노ReaderWriterLockSlim
은 (는) Interlocked
호출을 사용하여 구현됩니다.
이 전화는 include a memory barrier on x86이므로 추가 할 필요가 없습니다.
피터가 올바르게 지적했듯이, 구현은 명시 적으로가 아니라 메모리 장벽을 도입합니다.
보다 일반적으로 : C# 언어 사양에서는 특정 부작용이 잠금과 관련하여 잘 정렬되어야합니다. 이 규칙은 C# lock
문으로 입력 된 잠금에만 적용되지만 사용자 지정 잠금 프리미티브 공급자가 동일한 규칙을 따르지 않는 잠금 개체를 만드는 것은 매우 이상합니다. 두 번 확인하는 것이 현명합니다. 그러나 일반적으로 스레딩 프리미티브가 중요한 부작용을 효과적으로 처리 할 수 있도록 설계되었습니다.
메모리 장벽이없는 CAS가있는 CPU가 있지만 꽤 희귀합니다. 메모리 장벽이있는 CAS 폼도 있지만 실제로 궁극적 인 동시성을 원할 때가없는 CAS도 있다고 생각합니다. –