2013-03-06 2 views
1

모니터 클래스의 펄스 및 대기와 관련하여 질문이 있습니다. 다음은 코드의 발췌 부분입니다. 내 질문은 코드가는 무료가C# : 펄스 및 대기

// < < -----------

전까지 사물함에 붙어있을 것입니까?

 { 
     check = false; 
     new Thread(pulseWaitFun).Start(); 

     Console.Writeline("Threading tutorial"); 

     lock (locker) // <<----------- 
     { 
      check = true; 
      Monitor.Pulse(locker); 
     } 
     Console.ReadLine(); 
    } 

    static void pulseWaitFun() 
    { 
     lock (locker) 
     { 
      if(check != true) 
      { 
       Thread.Sleep(20000); 
       Monitor.Wait(locker); 

      } 
     } 

     Console.WriteLine("Woken !!"); 
    } 

두 번째 질문 후 Monitor.Pulse(locker); 다음 실행 순서는 무엇입니까?

+0

그냥 여기 좀 봐 숙제 – Nolonar

+0

냄새가 : http://www.codeproject.com/Articles/28785/Thread-synchronization-Wait-and-Pulse-demystified –

+0

없음은 없습니다. 그냥 내 개념을 정리! – user2140086

답변

3

로커가 무료가 될 때까지 코드가 멈추지 않을까요?

네,하지만 잠금은 Wait()를 입력하여 lock() {} 블록을 또는를 종료 발표 할 수있다.

Monitor.Pulse (보관함); 어떤 실행 순서를 따르겠습니까? 코드에서

순서는 가장 가능성이있을 것입니다 : 아무도 기다리고 있기 때문에 잠금이 즉시

  • Monitor.Pulse(locker);
  • 을 부여되도록 깔끔한
  • Thread(pulseWaitFun).Start();
  • lock (locker)

      가, 펄스가 낭비된다. 주요 방법
    1. 제 2 스레드가 실행을 시작하기에
    2. 종료 lock() ...

    당신은 아마, 스레드를 시작한 후 홈페이지() 안에 Thread.Sleep(100)를 원한다.

  • +0

    내부에서 스레드를 시작한 후'Thread.Sleep (100)'이있는 경우 메인 그러면 당신이 언급 한 실행 순서가 바뀌겠습니까? – user2140086

    +0

    @Henk Start.Wineline에서 ConsoleWriteline을 사용한 특별한 경우에 pulseWaitFun이 먼저 실행되고 잠김. – Alex

    +0

    @Alex - 아마도. 강조해야 할 것은 비 결정적이라는 것입니다. –

    1

    먼저 호출 할 잠금을 가정 할 수 없습니다. 다음과 같은 두 가지 옵션을 고려해 봅시다.

    • 먼저 기본 방법으로 잠금에 도달했습니다. 점검이 참으로 설정됩니다. Invoking Pulse는 효과가 없습니다. 다음 주 스레드는 잠금을 해제하고 두 번째 스레드는 pulseWaitFun에서 잠금을 해제 할 수 있습니다.
    • 먼저 pulseWaitFun에 도달했습니다. Check가 false이면 스레드가 잠자기 상태가되고 잠금을 실현하는 신호를 기다립니다. 이제 주 스레드가 잠금 및 펄스를받습니다. 그런 다음 자물쇠를 해제합니다. 그 후 펄스 완쾌가 진행될 수 있습니다.