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);
之后,接下来的执行顺序是什么?
我的q是代码会卡在…直到储物柜空闲?
可以,但是可以通过退出lock() {}
块或者通过进入Wait()
块来释放锁。
后Monitor.Pulse(柜);接下来的执行顺序是什么?
在您的代码中,顺序很可能是:
-
Thread(pulseWaitFun).Start();
-
lock (locker)
, uncontested,所以锁立即被授予 -
Monitor.Pulse(locker);
,脉冲被浪费了,因为没有人在等待。 - 在主方法中退出
lock()
- 第二个线程开始执行
你可能想要一个Thread.Sleep(100)
在Main()中,在启动线程后。
您不能假设哪个锁将首先被调用。让我们考虑两个选项:
- 首先到达主方法中的锁。Check设置为true。调用脉冲没有效果。下一个主线程释放锁,第二个线程可以在pulseWaitFun中获得它。
- Lock in pulseWaitFun方法首先到达。Check为false,线程处于睡眠状态,然后等待触发锁的信号。现在主线程获得锁和脉冲。然后释放锁。在此之后,pulseWaitFun可以继续。