c#:脉冲等待

时间:2013-03-06 13:27:53

标签: c# monitor

我对监视器类的脉冲和等待有疑问。以下是代码的摘录。我的问题是代码会被卡在

  

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

直到储物柜变为免费?

     {
        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);之后会执行哪些序列?

2 个答案:

答案 0 :(得分:3)

  

我的问题是代码会被卡住......直到储物柜变得空闲吗?

是的,但可以通过输入lock() {}退出Wait()阻止来解除锁定。

  

在Monitor.Pulse(储物柜)之后;什么将遵循执行顺序?

在您的代码中,序列很可能是:

  1. Thread(pulseWaitFun).Start();
  2. lock (locker),无争议,因此立即授予锁定
  3. Monitor.Pulse(locker);,Pulse被浪费了,因为没有人在等待。
  4. 在主方法中退出lock()
  5. 第二个线程开始执行...
  6. 启动线程后,您可能需要在Main()内部Thread.Sleep(100)

答案 1 :(得分:1)

您无法假设将首先调用哪个锁。让我们考虑两个选择:

  • 首先到达主方法锁定。检查设置为true。调用Pulse无效。下一个主线程释放锁,第二个线程可以在pulseWaitFun中获取它。
  • 首先达到锁定pulseWaitFun方法。检查是错误的,因此线程处于休眠状态,然后等待导致实现锁定的信号。现在主线程获取锁定和脉冲。然后释放锁。之后,pulseWaitFun可以继续。