문제

.NET에서 lock 키워드는 구문 설탕 주변입니다 Monitor.Enter 그리고 Monitor.Exit, 따라서이 코드를 말할 수 있습니다

lock(locker)
{
  // Do something
}

와 같다

Monitor.Enter(locker);
try
{
  // Do Something
}
finally
{
  Monitor.Exit(locker);
}

그러나 .NET 프레임 워크에도 포함됩니다 MemoryBarrier 비슷한 방식으로 작동하는 클래스

Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();

나는 사용하고 싶을 때처럼 혼란스러워 Thread.MemoryBarrier 위에 lock/Monitor 버전? 나는 더 혼란스러워졌다 스레딩 튜토리얼 그것들은 동일하게 기능한다고 말합니다.

내가 볼 수있는 한 가시적 차이는 잠금 물체가 필요하지 않습니다. Monitor 당신은 어디에서 스레드를 가로 질러 무언가를 할 수 있습니다 MemoryBarrier 단일 스레드에 있습니다.

내 직감은 또 다른 주요 차이점이 MemoryBarrier 변수만을위한 것이며 방법은 아닙니다.

마지막으로 이것은 기존 질문과 관련이 없습니다 threadSafe 잠금 코드에서 'volatile'또는 'strook.MemoryBarrier ()'를 사용하는시기? (씨#), 그것이 초점에 초점을 맞추고 있습니다 volatile 사용법을 이해하는 키워드.

도움이 되었습니까?

해결책

내 생각에 당신은 거의해야합니다 절대 사용 Thread.MemoryBarrier. 이것은 사용됩니다 잠금 장치 코드 - 잠금 비용을 발생시키지 않고 한 스레드의 변경 사항이 다른 스레드에서 다른 스레드로 표시되는지 확인하십시오. 그렇습니다 ~ 아니다 제어 스레드 동기화와 달리 lock. Joe의 튜토리얼에서 어디에 있는지 알 수 없습니다. MemoryBarrier "동일하게 기능한다" lock. 정확히 어디에서 그 인상을 받고 있는지 설명해 주시겠습니까?

내 생각에, 낮은 수준의 잠금 코드는 주된 숙련도가 동시성 인 개발자 이외의 다른 사람에게는 너무 어렵습니다. 잠금 코드를 작성하려면 더 높은 수준의 빌딩 블록을 사용하겠습니다. 세워짐 내 자신을 굴리기보다는 개발자 (.NET 4.0의 병렬 확장)에 의해.

예를 들어, 나는 최근에 눈을 뜨고 정확한 의미를 열었습니다. volatile 어느 그렇지 않습니다 "항상 메인 메모리에서 읽으십시오. 항상 메인 메모리에 직접 씁니다". (내 자신의 스레딩 튜토리얼에는 여전히 그 설명이 있습니다. 어느 시점에서 수정해야 할 것입니다.) 그것보다 훨씬 미묘합니다. 이것은 그것을 의미합니다 약간 나의 이전 용도 volatile 잘못 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top