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

时间:2016-09-06 08:03:40

标签: c# .net multithreading thread-synchronization

我有两个方法,第一个()和第二个(),我将它们分配给两个线程。

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

     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()但是发生了这种情况。

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

之后关注msdn

如果s主题没有将控制转移到f线程Monitor.Pulse()第二个()

,那么任何帮助都将不胜感激。

Follwinng是我的主要()

        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();

2 个答案:

答案 0 :(得分:4)

生产者/消费者示例适用于一个单元实例。我想你应该这样做。对于“第一个”和“第二个”,“this”的引用不同。

答案 1 :(得分:1)

由于您初始化了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 points out though,这也不保证可以正常工作,因为它假定First()是第一个获得锁定的人。