2013-08-16 3 views
3

아래와 같은 코드가있을 때 signal.WaitOne을 호출하는 스레드가 다른 스레드가 잠금을 획득하기 위해 획득 한 잠금을 해제하면 제 질문이 생깁니 까? 나는 이것이 사소한 질문이라고 생각한다. 그러나 나는 이것과 같은 것을 찾아 보았고 공허 해졌다. 누군가가 이것을 밝히고 내 글/제목을 수정하여 미래에이를 찾는 사람에게 더 검색 가능하게 만들 수 있다면 크게 감사하겠습니다.대기 대기 스레드가 획득하는 잠금을 처리합니다.

AutoResetEvent signal = new AutoResetEvent(false); 

foo() { 
    Monitor.Enter(locker); 
    try { 
     // code 

     if(condition) 
      signal.WaitOne(); 

     // code   
    } finally { 
     Monitor.Exit(locker); 
    } 
} 

편집 : 나는 나중에 참조 할 수 있도록이 편집을 만드는 중이라서 :

그것은 내가 뭘하려고 오전이 있습니다 더 나은 패러다임처럼 보인다

:

foo() { 
    Monitor.Enter(locker); 
    try { 
     // code 

     while(condition) 
      Monitor.Wait(locker); 

     // code   
    } finally { 
     Monitor.Exit(locker); 
    } 
} 

bar { 
    lock(locker) { 
     Monitor.Pulse(locker); 
    } 
} 
+3

'signal.WaitOne'은'Monitor'가하는 것에 아무런 영향을주지 않습니다 ... –

+0

@PeterRitchie - 의견을 남겨주세요! – Sandman

+0

안녕하세요 @PeterRitchie - 나중에 참조 할 수 있도록 수정했습니다. 편집을 비준 할 수 있으면 고맙겠습니다. – Sandman

답변

3

번호는 잠금이 Exit까지 개최됩니다. 일반적으로 자물쇠를 잡고있는 동안 차단하지 않도록하십시오. 그것은 교착 상태의 가능성을 증가시킵니다.

+0

답변 해 주셔서 감사합니다. 고맙습니다. – Sandman

+0

안녕하세요 @mike_z. 나중에 참조 할 수 있도록 편집했습니다. 비준 할 수 있으면 고맙겠습니다. 감사. – Sandman

+0

@Sandman'Pulse' /'Wait'의 정확한 사용법에 대해 완전히 잘 알고 있지는 않지만 한 가지만 수정했습니다. 또한,'lock' 키워드는 try/finally로'Enter' /'Exit' 작업을합니다. –

관련 문제