Monitor.Pulse 的线程同步未按预期工作

Thread synchronization with Monitor.Pulse NOT working as expected

我有两个方法,first() 和 second(),我将它们分配给两个线程。

以下是我的第二种和第一种方法

     public void first()
    {
        lock (this)
        {
            Monitor.Wait(this);   

            Console.WriteLine("First");
            Monitor.Pulse(this);
        }
    }

    public void second()
    {
        lock (this)
        {
            //Monitor.Wait(this);
            Console.WriteLine("Second");
            Monitor.Pulse(this);
        }
    }

问题仅在控制台上 "Second" 正在打印。 尽管我在 second() 中有 Monitor.Pulse() 来通知控件应该转移到 first() 但这并没有发生。

我正在关注 msdn https://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

对于为什么 s 线程没有将控制权转移到 f 线程 Monitor.Pulse() in second()

的信息,我们将不胜感激

Follwinng 是我的 Main()

        test t = new test();
        test1 t1 = new test1();
        Thread f = new Thread(new ThreadStart(t.first));
        Thread s = new Thread(new ThreadStart(t1.second));
        f.Start();
        s.Start();
        f.Join();
        s.Join();

生产者/消费者示例适用于一个单元实例。我认为你也应该这样做。您的 'first' 和 'second' 对“this”的引用不同。

由于您初始化了 Test-class 的两个实例(或者您有两个单独的 classes,TestTest1),您的this-关键字在两种方法中的用法指的是两个不同的对象。

不要锁定上下文对象,而是创建一个两种方法都可以访问的静态对象,然后锁定它:

public class Test
{
    static object _key = new object();

    public void First()
    {
        lock (_key)
        {
            Monitor.Wait(_key);
            Console.WriteLine("First");
            Monitor.Pulse(_key);
        }
    }

    public void Second()
    {
        lock (_key)
        {
            Console.WriteLine("Second");
            Monitor.Pulse(_key);
        }
    }
}

First()Second() 放在同一个 class 中,并创建该 class 的两个实例,而不是一个 Test 和一个 Test1,您应该会看到预期的结果,即程序的输出将是

Second
First

编辑:与一样,这也不能保证有效,因为它假定First()是第一个获得锁的人。