0

给定以下代码,当我按下 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没有改变。

有谁知道为什么?

4

2 回答 2

1

_go 永远不会在没有 Monitor.Wait 的情况下更改,因为线程工作方法锁定 _locker,这就是为什么主线程无法获取相同的锁以更改 _go 值

于 2013-03-31T14:02:35.717 回答
0

如果它在,您需要调用Pulse以唤醒工作线程Monitor.Wait

我写了一篇关于正确使用方法的文章Waitand Pulse

Thread synchronization: Wait and Pulse demystified

于 2013-03-31T13:59:41.697 回答