2012-07-16 3 views
0

나는이 주제가 너무 많은 게시물을 읽었을뿐 아니라 다른 곳에서도 읽을 수 있지만 아직 확실한 답변을 찾지 못했기 때문에 내 사과가 당신이 있다면 이 여분의 중복으로 인해 불쾌감을 느낀다.한 번 쓰기, 많은 읽음 잠금

일회성의 수백만 읽기 리소스가있는 상황이 있습니다. 리소스는 생성하는 데 극도로 비싸며 쓰기 잠금에 대한 경합도 매우 높을 수 있습니다. 또한, 어떤 프로세서가 실행될 지 예측할 수 없으므로 메모리 모델이 무엇인지 알지 못합니다. .NET 3.5, .NET 4.0 및 Mono 2.10에서 빌드 된 어셈블리의 3 가지 버전을 컴파일 중입니다.

자원에 대한 높은 경쟁 때문에 가능한 한 효율적으로 만들 필요가 있습니다. 적어도 읽기에는 잠금 해제 패턴을 사용하고 싶습니다. 리소스를 만드는 이중 잠금 확인 패턴을 이해하지만 메모리 장벽 외부의 _resource 액세스로 인해 (모든 프로세서에서) 작동하는지 여부에 대한 의견 차이가있었습니다. _resource 필드에서 volatile을 사용해야합니까? ReaderWriterLockSlim이이 시나리오에 더 잘 맞습니까? 다른 질문이 있습니까?

if(_resource == null) 
{ 
    return _resourceDefault; 
} 

return _resource.GetSomething(); 
+0

여기에 잠금 기능이있는 이유는 무엇입니까? – leppie

+0

리소스를 생성하는 비용이 매우 비싸고 여러 번 할 수 없습니다. 연결을 추적하는 서버와의 원격 통신을 포함합니다. –

+0

글쎄, 스레드가 읽기 전에 일찍 끝내야합니다. 잠금 장치가 필요 없습니다. 이 모든 것이 너무 모호하여 구체적인 조언을 제공하지 않습니다. –

답변

1

이 대답에 내 의견을 추진하기로 결정

if(_resource == null) 
{ 
    lock(_locker) 
    { 
     if(_resource == null) 
     { 
      //create resource here... 
     }  
    } 
} 

은 또한, 이들의 수있을 것입니다.

싱글 톤의 읽기 작성시 http://msdn.microsoft.com/en-us/library/ff650316.aspx. 교차 잠금은 이중 확인 잠금과 관련된 몇 가지 문제점을 설명하는 깊이있는 용지를 연결합니다. 완전히 안전하려면 Microsoft 소송에서 휘발성 제품을 권장합니다.

독자가 원하는 것은 모두 싱글 톤을 만드는 것입니다 (한 번만 ... 잠금을 사용하지 않거나 아무것도 필요하지 않은 경우). 독자는 정말로 의지). 리소스가 생성되면 잠금을 전혀 건드리지 않습니다.

항상 정적 속성/메서드를 통과하도록 싱글 톤에 대한 액세스를 설계하므로 항상 이중 체크를 수행 할 수 있습니다.

리소스 기본값에 대해 제대로 대답 할 수있는 상황에 대해 충분히 알고 있다고 생각하지 않습니다. 기본 리소스가 생성되기 전에는 null이 될 것으로 기대하십니까? 사용 사례에 따라 Moniter.TryEnter를 사용할 수 있습니다. Moniter.TryEnter는 비 블로킹이며 잠금을 받았는지 여부를 알려주는 값을 반환합니다. 싱글 톤을 만들기 위해 자물쇠를 즉시 얻을 수 없다면 기본값을 반환 할 수 있습니다.

+0

예, 자원을 필요로하지 않고 결과를 반환 할 수있는 경우가 있습니다. 그러나 리소스가 있으면 사용하고 그렇지 않으면 기본값을 반환합니다. –

+0

내가 읽은 종이를 읽었지 만, 휘발성 데이터를 사용할 때, 사용하지 말아야 할 때 등과 같은 모순 된 정보가 많습니다. 일반적으로 x86 또는 x64 기반 컴퓨터에서는 그것. 그러나, 나는 어느 정도의 하드웨어를 사용해야 할지를 확신 할 수 없으며, 읽을 때 포착 펜스가 사용되는지 확인해야합니다. Thread.MemoryBarrier()를 발행 할 수는 있지만 읽는 것을 어렵게 만듭니다. 어쨌든, 노력해 주셔서 감사 드리며, 수락하기 전에 다른 사람이 배관에 연결되어 있는지 기다려 볼 것입니다. –

+0

.NET 2.0 이상에서는 휘발성이 필요하지 않지만 Mono는 동일한 보증을 제공하지 않기 때문에 안전하고 휘발성 키워드를 사용했습니다. –