如果没有Wait和Pulse信号,代码就不能正常工作
本文关键字:常工作 工作 就不能 代码 Wait Pulse 信号 如果没有 | 更新日期: 2023-09-27 18:06:47
给出以下代码,当我按回车键时,阻塞条件发生了变化:
class Program
{
static readonly object _locker = new object();
static bool _go;
static void Main()
{
new Thread(Work).Start();
Console.ReadLine();
lock (_locker)
{
_go = true;
Monitor.Pulse(_locker);
}
}
static void Work()
{
lock (_locker)
while (!_go)
Monitor.Wait(_locker);
Console.WriteLine("Woken!!!");
}
}
但是如果我不使用Monitor.Wait
和Monitor.Pulse
,那么Console.WriteLine("Woken!!!");
从未被调用,看起来_go
标志没有改变。
有人知道为什么吗?
_go在没有Monitor的情况下永远不会更改。等待,因为线程的工作方法锁定_locker,这就是主线程不能获得相同的锁,以改变_go值
如果工作线程在Monitor.Wait
中,则需要调用Pulse
来唤醒它
我写了一篇关于正确使用Wait
和Pulse
的文章:
Thread synchronization: Wait and Pulse demystified