c#:脉冲和等待

本文关键字:等待 脉冲 | 更新日期: 2023-09-27 18:02:37

我有一个关于班长班的脉搏和等待的问题。以下是代码摘录。我的问题是代码是否会卡在

//& lt; & lt ;-----------

直到locker变为free ?

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

c#:脉冲和等待

我的q是代码会卡在…直到储物柜空闲?

可以,但是可以通过退出lock() {}或者通过进入Wait()来释放锁。

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

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

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

你可能想要一个Thread.Sleep(100)在Main()中,在启动线程后。

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

  • 首先到达主方法中的锁。Check设置为true。调用脉冲没有效果。下一个主线程释放锁,第二个线程可以在pulseWaitFun中获得它。
  • Lock in pulseWaitFun方法首先到达。Check为false,线程处于睡眠状态,然后等待触发锁的信号。现在主线程获得锁和脉冲。然后释放锁。在此之后,pulseWaitFun可以继续。