2013-01-17 2 views
7

다음과 같은 상황이 있습니다. 개체에 대한 상호 배제를 원합니다.잠금 및 모니터를 동일한 개체에서 안전하게 사용할 수 있습니까?

지금까지 내가 normaly 지금은 또 다른 스레드에서 호출 할 수있는 방법이 잠금 객체

object lockObject = new object(); 
... 

method1: lock(lockObject) { CODE1 } 

을 사용합니다. 그것은 알 수없는 시간 동안 차단되어서는 안되며, 정의 된 시간 내에 응답을 제공해야합니다. 내가 모니터를 사용하는 것이이 경우

지금

method2: 
try{ 
    Monitor.TryEnter(lockObject , 20000, ref lockTaken); 
    if (lockTaken) {CODE2} 
} 
catch(...){...} 
finally 
{ 
    if (lockTaken) Monitor.Exit(timerLock); 
} 

처럼 내 질문은 : 잠글 수와 모니터는 lockobject가 동일한 경우와 같은 방법으로 혼합되어 서로 서로를 배제, 또는하고자 할 모든 잠금 장치를 모니터로 변경해야합니다.

그래서 같은 토큰이 "잠겨"있거나 모니터가 객체에 대한 다른 토큰을 만든 다음 잠금을 만들까요?

한 눈에 내가 응용 프로그램이 동시에 두 코드에서 실행되는 것을 볼 수 없습니다. 그러나 CODE1과 CODE2가 병렬로 실행되는 타이밍 문제가 있는지 여부는 알 수 없습니다.

+1

나는 당신의 고통을 느낍니다. 나는 종종 'lock' 키워드가 어떻게 든 타임 아웃을 걸렸 으면 좋겠다. –

답변

6
lock (sync) 
{ 
    return World(); 
} 

중급어로이 라인을 살펴 보겠습니다.

L_0007: call void [mscorlib]System.Threading.Monitor::Enter(object) 
L_000c: call int32 Hello::World() 
L_0011: stloc.0 
L_0012: leave.s L_001b 
L_0014: ldloc.1 
L_0015: call void [mscorlib]System.Threading.Monitor::Exit(object) 

그래야합니다. 그것들은 기술적으로 동등합니다.

+0

최근 버전의 csc는 .NET 4 이상을 대상으로 할 때 IL이 다른 –

+0

이 될 것입니다. 감사합니다. 거친 그림을 그렸습니다. –

5

는 잠그고 lockobject가 같은 경우 같은 방법으로 혼합 모니터링하고 서로 서로

가 네, 완전히 안전 제외하고는 작동 할 수 있습니다.

lock { } 문은 Monitor.Enter() 및 Monitor.Exit() 호출로 다시 작성됩니다. 그것은 단지 짧은 손으로, using() {} 문장과 매우 ​​유사합니다.

MSDN에서

:

lock (x) ... 

이된다 FX4에서

System.Threading.Monitor.Enter(x); 
try { 
    ... 
} 
finally { 
    System.Threading.Monitor.Exit(x); 
} 

그리고 의견에 따라

, 나중에는 Monitor.TryEnter()을 사용할 수 있습니다. 그러나 위의 간단한 버전은 질문에 대한 답변입니다.

+2

또는 .NET 4+를 목표로 할 때 Monitor.TryEnter를 자주 사용한다. –

관련 문제