C# c:脉搏和等待

C# c:脉搏和等待,c#,monitor,C#,Monitor,我有一个关于班长的脉搏和等待的问题。下面是代码的摘录。我的问题是代码是否会被卡住 // 我的问题是代码是否会停留在。。。直到储物柜变空 { check = false; new Thread(pulseWaitFun).Start(); Console.Writeline("Threading tutorial"); lock (locker) // <<----------- {

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

// 我的问题是代码是否会停留在。。。直到储物柜变空

     {
        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 !!");
    }
是的,但是可以通过退出锁{}块或输入等待来释放锁

后监视器。脉冲锁定器;接下来的执行顺序是什么

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

ThreadpulseWaitFun.开始; 锁柜,无竞争,因此立即授予锁 监视器脉冲锁定器,脉搏被浪费了,因为没有人在等待。 退出主方法中的锁 第二个线程开始执行。。。 在启动线程后,您可能需要在Main中创建一个Thread.Sleep100

我的问题是代码是否会停留在。。。直到储物柜变空

     {
        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 !!");
    }
是的,但是可以通过退出锁{}块或输入等待来释放锁

后监视器。脉冲锁定器;接下来的执行顺序是什么

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

ThreadpulseWaitFun.开始; 锁柜,无竞争,因此立即授予锁 监视器脉冲锁定器,脉搏被浪费了,因为没有人在等待。 退出主方法中的锁 第二个线程开始执行。。。
在启动线程后,您可能需要在Main中创建一个Thread.Sleep100

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

先达到锁定主方法。Check设置为true。调用脉冲没有效果。下一个主线程释放锁,第二个线程可以在pulseWaitFun中获取锁。 先达到锁定脉冲的方法。检查为false,所以线程处于休眠状态,然后等待导致实现锁的信号。现在主线程获得锁和脉冲。然后释放锁。之后,PulsweaitFun可以继续。
您不能假定将首先调用哪一个锁。让我们考虑两个选项:

先达到锁定主方法。Check设置为true。调用脉冲没有效果。下一个主线程释放锁,第二个线程可以在pulseWaitFun中获取锁。 先达到锁定脉冲的方法。检查为false,所以线程处于休眠状态,然后等待导致实现锁的信号。现在主线程获得锁和脉冲。然后释放锁。之后,PulsweaitFun可以继续。
看看这里:不,不是。只是为了澄清我的想法@user2140086为了更好地理解它,您应该将锁分解为其实现try/finally with Monitor.Enter/Monitor.Exit,该语法最初可能是confusing@Nolonar所以如果是作业呢?这个问题很清楚,是个好问题。不管是不是家庭作业,IMHO。@FilipEkberg如果是家庭作业,OP应该拥有在没有任何外部帮助的情况下找到答案所需的所有材料/参考资料。如果它确实是家庭作业,显然不是。此外,如果你认为这个问题是好的,你应该投赞成票。看看这里:不,不是。只是为了澄清我的想法@user2140086为了更好地理解它,您应该将锁分解为其实现try/finally with Monitor.Enter/Monitor.Exit,该语法最初可能是confusing@Nolonar所以如果是作业呢?这个问题很清楚,是个好问题。不管是不是家庭作业,IMHO。@FilipEkberg如果是家庭作业,OP应该拥有在没有任何外部帮助的情况下找到答案所需的所有材料/参考资料。如果它确实是家庭作业,显然不是。此外,如果你认为这个问题是好的,你应该投票表决。那么,如果我在main中启动线程后有Thread.Sleep100,那么你提到的执行顺序会改变吗?@Henk在他的控制台特例中说。Writeline在启动后,pulseWaitFun首先被执行并锁定。@Alex-可能。我应该强调的是,它是不确定的。@HenkHolterman是的,确实如此,因为你永远不知道线程何时被调度。因此,如果在main中启动线程后我有thread.Sleep100,那么你提到的这个执行顺序会改变吗?@Henk在他的特殊情况下使用Console.Writeline启动后,pulseWaitFun首先被执行并锁定。@Alex-可能吧。我应该强调的是,它是不确定的。@HenkHolterman是的,确实如此,因为你永远不知道线程何时被调度。