如果没有使用Wait和Pulse发送信号,代码将无法正常工作

时间:2013-03-31 13:55:31

标签: c# multithreading

鉴于以下代码,当我按下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.WaitMonitor.Pulse,那么Console.WriteLine("Woken!!!");从未被调用过,那么_go标志似乎没有改变。

有谁知道为什么?

2 个答案:

答案 0 :(得分:1)

如果没有Monitor.Wait,那么

_go永远不会更改因为线程工作方法会锁定_locker,这就是为什么主线程无法获取相同的锁以便更改_go值

答案 1 :(得分:0)

如果Pulse

,则需要致电Monitor.Wait来唤醒工作线程

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

Thread synchronization: Wait and Pulse demystified