我对监视器类的脉冲和等待有疑问。以下是代码的摘录。我的问题是代码会被卡在
//<< -----------
直到储物柜变为免费?
{
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);
之后会执行哪些序列?
答案 0 :(得分:3)
我的问题是代码会被卡住......直到储物柜变得空闲吗?
是的,但可以通过输入lock() {}
退出Wait()
阻止或来解除锁定。
在Monitor.Pulse(储物柜)之后;什么将遵循执行顺序?
在您的代码中,序列很可能是:
Thread(pulseWaitFun).Start();
lock (locker)
,无争议,因此立即授予锁定Monitor.Pulse(locker);
,Pulse被浪费了,因为没有人在等待。 lock()
启动线程后,您可能需要在Main()内部Thread.Sleep(100)
。
答案 1 :(得分:1)
您无法假设将首先调用哪个锁。让我们考虑两个选择: