2011-03-09 4 views
1

Monitor와 비슷한 동기화 프리미티브가 필요하지만 입력 한 횟수만큼 종료 할 필요가 없습니다. 한 스레드에서 Monitor로 들어가서 같은 스레드에서 다시 입력하면 Monitor.Exit을 두 번 호출해야합니다. 하지만 한 번의 호출로 종료해야합니다.동기화 primitive "lock once"

이제 Monitor에 들어 가지 않는 Monitor 래퍼를 사용합니다. Monitor가 이미 현재 스레드에 의해 입력 되었다면 (따라서 한 번의 호출로 종료 할 수 있습니다). 그러나 .NET Framework에 하나가있을 수 있습니까?

+1

하지 대답 :하지만 재진입 잠금이 좋은 생각이 아니다는 ... http://zaval.org/resources/library/butenhof1.html – tiago2014

+0

Microsoft는 ReaderWriterLockSlim을 구성 할 수 있습니다 (예를 들어) 입력 할 재귀 적으로,하지만 그들은 좋은 아이디어라고 생각하지 않습니다. http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx – tiago2014

답변

1

Monitor.Exit에 대한 동일한 전화 번호없이 Monitor.Enter 번을 여러 번 호출하는 이유가 궁금합니다. 일반적으로 이러한 동기화 코드는 다음과 같습니다

try 
{ 
    Monitor.Enter(lockObject); 
    // some code that needs to be synchronized 
} 
finally 
{ 
    Monitor.Exit(lockObject); 
} 

을 가정하면 try/finally를 사용하면 Monitor.Enter (당신이 해야 함), I는 데 문제가 당신이 필요로하는 이유보고를 사용하여 잠금을 획득 곳 네가 물어 보는이 "자물쇠"수업.

사실, 당신은 기본적으로 본질적으로 같은 일이 lock 문 사용하는 것입니다 수행하는 매우 간단한 방법으로, 어쨌든 자신이 작업을 수행 할 필요가 없습니다해야했다

lock (lockObject) 
{ 
    // some code that needs to be synchronized 
} 

을 그냥 확실하게 할 수 뭔가 빠져있다.

+0

재귀 함수의 경우 첫 번째 항목 만 잠글 필요가있을 수 있습니다. – vines

0

어떻게이 스레드가 같은 스레드인지 그리고이 스레드가 떠날 때 나가기 전에 종료 코드를 호출하는지 어떻게 알 수 있습니까?

외모에 따르면, 자물쇠가있는 다른 것 (외부 레벨에서)이 필요합니다. 어쩌면 자물쇠가있는 다른 방법을 잠그고 호출하는 "진입 점"방법 일 수 있습니다. 그런 다음 자물쇠를 지나지 않고 여러 번이 다른 방법을 호출 할 수 있습니다.

public static void MethodOne() 
{ 
    lock (lockObj) 
    { 
    MethodTwo(); 
    } 
} 

private static void MethodTwo() 
{ 
    //This method can be called multiple times 
    //without going past MethodOne and so you only 
    //lock once 
} 

private static void MethodThree() 
{ 
}