1

我有一个关于监视器类的脉搏和等待的问题。以下是代码的摘录。我的问题是代码会卡在

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

直到储物柜免费?

     {
        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);接下来的执行顺序是什么?

4

2 回答 2

3

我的问题是代码会一直停留在...直到储物柜免费?

是的,但是可以通过退出lock() {}输入Wait().

在 Monitor.Pulse(locker) 之后;接下来的执行顺序是什么?

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

  1. Thread(pulseWaitFun).Start();
  2. lock (locker), 无争议,因此立即授予锁
  3. Monitor.Pulse(locker);,脉冲被浪费了,因为没有人在等待。
  4. lock()在 main 方法中退出
  5. 第二个线程开始执行......

在启动 Thread 之后,您可能需要一个Thread.Sleep(100)内部 Main()。

于 2013-03-06T13:48:51.530 回答
1

您不能假设将首先调用哪个锁。让我们考虑两个选项:

  • 首先达到锁定主要方法。检查设置为真。调用脉冲没有效果。下一个主线程释放锁,第二个线程可以在 pulseWaitFun 中获取它。
  • 首先到达 lock in pulseWaitFun 方法。检查为假,因此线程处于睡眠状态,然后等待导致实现锁的信号。现在主线程获取锁和脉冲。然后释放锁。之后 pulseWaitFun 可以继续。
于 2013-03-06T14:03:04.003 回答