2011-11-18 5 views
5

나는 생성 된 코드를보고 있는데 TryEnter를 한 메서드 호출로 사용하고 다른 메서드는 잠급니다. 이렇게 :Monitor.TryEnter와 lock()이 함께 작동합니까?

private readonly object xmppLock = new object(); 

void f1() 
{ 
    if (Monitor.TryEnter(xmppLock)) 
    { 
     try 
     { 
      // Do stuff 
     } 
     finally 
     { 
      Monitor.Exit(xmppLock); 
     } 
    } 
} 

void f2() 
{ 
    lock(xmppLock) 
    { 
     // Do stuff 
    } 
} 

괜찮습니까? 자원을 사용할 수있을 때까지

답변

2

잠금이 차단됩니다

TryEnter 이미 잠겨있는 경우 아무것도하지 않습니다.

필요에 따라 둘 중 하나를 사용해야합니다.

귀하의 경우에있어서 f2()은 아무리 오랜 시간이 걸리더라도 항상 그렇게 할 것입니다. f1()은 잠금 경합이 있으면 즉시 반환합니다

+0

동일한 질문으로 ** lock **과 Monitor.TryEnter를 섞을 수 있는지 여부에 대한 질문에 대답하지 않습니다. [비슷한 질문에 대한 답변보기] (https://stackoverflow.com/q/14377366/199364) – ToolmakerSteve

8

lockMonitor.Enter의 구문 설탕 일뿐입니다. 그래, 정상적으로 작동합니다. The Visual Basic SyncLock and C# lock statements use Monitor.Enter to take the lock and Monitor.Exit to release it. The advantage of using the language statements is that everything in the lock or SyncLock block is included in a Try statement.

(즉, 그것은 Type 객체 같은 것을 공개에 고정하는 가난한 양식을 간주했다.)

+0

OP가 사용하는 TryEnter ** –

+0

TryEnter를 사용하여 잠금을 획득하는 것은 당연한 일입니다. 한 곳에서 다른 곳에서'Enter '를 사용하여 그것을 얻는 것과 함께 작동 할 것이므로, 그렇게 살 가치가 없습니다. – mquander

4

예이 두 구조가 함께 작동합니다. C# lock 키워드는 Monitor.EnterMonitor.TryEnter 메서드에 대한 단순한 래퍼입니다.

참고 : 잠금 값으로 Type 인스턴스를 사용하지 마십시오. 이렇게하면 매우 관련이없는 두 개의 코드가 예기치 않게 동일한 객체에 잠기는 것이 매우 쉽기 때문에 매우 약합니다. 교착 상태가 발생할 수 있습니다.

+0

typeof()에 관한 포인터를 보내 주셔서 감사합니다. 나는 내가 편집하고있는 코드가 아니라 내가 무엇이 일어나고 있는지를 알고 싶었던 것처럼 그것이 무엇을하는지 이해하지 못했기 때문에 이것에 관해 다른 질문을했다. – Firedragon

관련 문제