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是的,确实如此,因为你永远不知道线程何时被调度。