2009-03-13 2 views
1

코드가 약간 있습니다. 제대로 파악할 수 없습니다. 문제는 프로그램이 멀티 스레드라고하고있다 이내에 동기화해야합니다 코드의 비트는 내가 쓴 :C# 모니터 클래스의 멀티 스레드 문제 - 수명이 있습니까?

lock (lockObject) 
{ 
    if (!Monitor.TryEnter(lockObject)) 
    Monitor.Wait(lockObject); 

    //do stuff... 
    Monitor.PulseAll(lockObject); 
} 
Monitor.Exit(lockObject); 

내가있어 문제가 어떤 시점에 모든 스레드가 될 것이다 자고 - 왜 누군가에게 말할 수 있습니까? 프로그램은 끝없이 거의 CPU를 소비하지 않고 계속 실행되지만 아무런 작업도 수행되지 않습니다. 프로그램을 추적 할 때 어느 시점에 스레드가 활성화되어 있지는 않지만 전체가 많이 잠자고 있음을 알게되었습니다. 나는 대부분 개발자 (항상 개발자의 경우)가 모니터 앞에서 0.5m를 차지하고 있음을 안다.하지만 몇 분 안에 나 자신을 알아낼 수 없다.)

누군가가 다음과 같이 설명 할 수있다. 나 - 미리 감사드립니다.

+0

LockObject가 Monitor.TryEnter를 켜고있는 LockObject이거나 LockObject 유형을 잠그고 있습니까? –

+0

예 - 고전적인 오타였습니다 – Gambrinus

답변

1

LockObjectlockObject 사이에 차이가 있습니까? 그것은 분명하지 않다 ...

그러나! 서로 다른 객체 인 경우 첫 번째로 : 가지고 있지 않은 자물쇠에 Wait을 넣을 수 없으며 ... TryEnter은 시간 초과를 지정하는 경우에만 false를 반환합니다. 그 코드가 정확히 무엇을하려고합니까?

문맥이 없으면 PulseAllWait의 의도는 무엇인지 완전히 명확하지 않습니다. 예를 들어, here 큐가 너무 꽉 차있을 때 (Wait) 대기열을 차단하거나 공간을 사용할 수있게되면 해제합니다 (PulseAll). 스레드 간의 완전한 상호 작용없이 스레딩 코드를 디버그하기는 어렵습니다.

그것은 당신이 단지해야 할 수도 같은 소리 :

lock (lockObject) 
{ 
    // do stuff 
} 

내가 볼 수있는 두 가지 즉각적인 문제가있다; 먼저, 항상 잠금 장치 (예 : 예외)를 해제한다는 것이 명확하지 않습니다. Enter/Exitlock을 사용해보세요. 올바른 결과를 얻으실 수 있습니다.

둘째로; 모든 스레드가 Wait ...을 호출하면 누가 그들을 깨울 것입니까? 그들은 무엇을 기다리고 있습니까 ? 제시된 바와 같이 : 예, 그들은 모두 무한정 잔다.

3

저는 첫 번째 lock 문이 오타이고 lock (lockObject) (소문자)을 의미한다고 가정합니다.

여기 자물쇠를 조금 잘못 이해한다고 생각합니다. 코드의 if 블록은 사실이 아닙니다. 이 잠금 (lockObject) 인 이유는 실제로 그래서 당신은 당신이 이미 잠금을 소유하고있는 경우 블록을 쳐서 TryEnter가 항상 성공해야하는 시간으로 다음

Monitor.Enter(lockObject); 
try { 
... 
} finally{ 
Monitor.Exit(lockObject); 

에 exapands.

+0

변수를 주거나 가져 가십시오 --p 정보의 경우이 패턴이 C# 4.0에서 변경된 것처럼 보입니다 : http://blogs.msdn.com/ericlippert/archive/2009/03/06 /locks-and-exceptions-do-not-mix.aspx –

+0

@Marc, 네,이 변화를 보는 것은 매우 흥미 롭습니다. – JaredPar

+0

@Marc, 흥미로운 링크 - 고마워. – Gambrinus

1

이상한 설정입니다. 'LockObject'는 'lockObject'와 같은가요? 또는 오타가 무엇입니까? 동일하다면, 이미 잠겨있는 것을 Monitor.TryEnter를 호출 할 필요가 없으므로 설정이 중복됩니다. 'LockObject'가 다른 객체 인 경우 Monitor.Exit을 lock 문 내부로 이동하지 않는 이유는 무엇입니까?