2013-03-06 143 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 2013-03-06 13:29:19

+0

只要看看這裏:http://www.codeproject.com/Articles/28785/Thread-synchronization-Wait-and-Pulse-demystified – 2013-03-06 13:33:10

+0

沒有它不是。只是爲了清除我的概念! – user2140086 2013-03-06 13:33:50

回答

3

我的問題是代碼被卡在...直到更衣室變得自由了嗎?

是的,但鎖可以通過輸入一個Wait()退出lock() {}OR被釋放。

後Monitor.Pulse(更衣室);接下來的執行順序是什麼?

在你的代碼序列將最有可能是:

  1. Thread(pulseWaitFun).Start();
  2. lock (locker),無可爭議所以鎖定立即授予
  3. Monitor.Pulse(locker);,脈衝被浪費,因爲沒有人在等待。
  4. 退出lock()在main方法
  5. 第二屆線程開始執行...

你可能需要一個Thread.Sleep(100)內的Main(),啓動線程之後。

+0

所以,如果我有'的Thread.Sleep(100)'內啓動線程後那麼主要是你的這個執行順序會改變嗎? – user2140086 2013-03-06 14:07:19

+0

@Henk在啓動後爲Console.WriteLine他的特殊情況,pulseWaitFun被執行第一和鎖。 – Alex 2013-03-06 14:08:58

+0

@Alex - 可能。我應該強調的是它是非確定性的。 – 2013-03-06 14:50:50

1

您不能假設首先調用哪個鎖。讓我們考慮兩種選擇:

  • 首先在主要方法中鎖定。檢查設置爲true。調用脈衝不起作用。下一個主線程釋放鎖,第二個線程可以在pulseWaitFun中獲得。
  • 先鎖定pulseWaitFun方法。檢查是錯誤的,所以線程正在休眠,然後等待導致實現鎖定的信號。現在主線程獲得鎖和脈衝。然後釋放鎖。之後,pulseWaitFun可以繼續。