鉴于以下代码,当我按下Enter键时阻塞条件正在改变:
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
标志似乎没有改变。
有谁知道为什么?
答案 0 :(得分:1)
_go永远不会更改因为线程工作方法会锁定_locker,这就是为什么主线程无法获取相同的锁以便更改_go值
答案 1 :(得分:0)
如果Pulse
Monitor.Wait
来唤醒工作线程
我写了一篇关于使用Wait
和Pulse
的正确方法的文章: