2013-03-06 145 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可以继续。