如果没有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.WaitMonitor.Pulse,那么Console.WriteLine("Woken!!!");从未被调用,看起来_go标志没有改变。

有人知道为什么吗?

如果没有Wait和Pulse信号,代码就不能正常工作

_go在没有Monitor的情况下永远不会更改。等待,因为线程的工作方法锁定_locker,这就是主线程不能获得相同的锁,以改变_go值

如果工作线程在Monitor.Wait中,则需要调用Pulse来唤醒它

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

Thread synchronization: Wait and Pulse demystified