2013-03-31 44 views
0

考慮下面的代碼信號,當我敲回車鍵阻塞條件正在發生變化:代碼不起作用根據需要而不等待和脈衝

class Program 
{ 
    static readonly object _locker = new object(); 
    static bool _go; 
    static void Main() 
    { 
     new Thread(Work).Start(); 
     Console.ReadLine(); 
     lock (_locker) 
     { 
      _go = true; 
      Monitor.Pulse(_locker); 
     } 
    } 
    static void Work() 
    { 
     lock (_locker) 
      while (!_go) 
       Monitor.Wait(_locker); 
     Console.WriteLine("Woken!!!"); 
    } 
} 

但是,如果我不使用Monitor.WaitMonitor.Pulse然後Console.WriteLine("Woken!!!");從未被調用過,看起來好像_go標誌沒有改變。

有誰知道爲什麼?

+1

有一個很好的(和免費的)有關線程的電子書:['Albahari'](http://www.albahari.com/threading/) –

回答

1

_go是永遠改變沒有Monitor.Wait因爲線程工作方法鎖_locker,這就是爲什麼主線程無法獲得相同的鎖,以便更改_go值

+0

「Monitor」方法的任何替代方法? –

+0

AutoResetEvent/ManualResetEvent或Semaphore - 這取決於您的需求。如果您需要創建「多個通知」,最後一個是更好的選擇。 – aguyngueran

0

需要調用Pulse喚醒工作線程,如果它是在Monitor.Wait

我寫了一篇關於正確的使用方法WaitPulse

Thread synchronization: Wait and Pulse demystified

+0

謝謝,我會讀它。很高興看到你寫了這篇文章,在網上找不到關於這個主題的任何非常好的文檔。 –