与Monitor的线程同步.脉搏不正常

本文关键字:脉搏 不正常 同步 线程 Monitor | 更新日期: 2023-09-27 18:05:44

我有两个方法,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()在第二()

下面是我的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();

与Monitor的线程同步.脉搏不正常

这个生产者/消费者的例子只作用于一个cell实例。我觉得你也应该这么做。对于"第一"answers"第二",对"this"的引用是不同的。

由于您初始化了Test -类的两个实例(或者您有两个单独的类,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()放在同一个类中,并创建该类的两个实例,而不是一个Test和一个Test1,您应该看到您期望的结果,即程序的输出将是

Second
First

编辑:正如Damien指出的那样,这也不能保证工作,因为它假设First()是第一个获得锁的。