使用Monitor进行线程同步

时间:2014-03-23 15:30:22

标签: c# multithreading

我正在尝试在C#中开始使用多线程。我正在尝试编写一个带有两个线程的程序 - 给定一个数字n,一个线程将打印所有偶数到n,另一个线程将打印所有奇数。我试图让这两个线程使用Monitor同步,以便它们按顺序打印数字。

以下是我到目前为止所遇到的问题,它遇到了僵局。我该如何纠正?另外,请帮助我了解发送到Pulse和Wait的对象的意义是什么?我无法从文档中理解。

    class NumPrint
{
    public Thread other{get; set;}

    int first, max;

    public NumPrint(int first, int max, bool thisFlag) 
    {
        this.first = first;
        this.max = max;            
    }

    public void DoWork()
    {
        for (int i = first; i <= max; i+=2)
        {
                Console.WriteLine(i);
                lock (this)
                {
                    Monitor.Pulse(this);
                }
                lock (other)
                {
                    Monitor.Wait(other);
                }
        }
    }

}
class Program
{
    static void Main(string[] args)
    {
        NumPrint odd = new NumPrint(1, 10,false);
        NumPrint even = new NumPrint(2, 10, true);


        Thread oddThread = new Thread(new ThreadStart(odd.DoWork));
        Thread evenThread = new Thread(new ThreadStart(even.DoWork));

        odd.other = evenThread;
        even.other = oddThread;

        oddThread.Start();
        evenThread.Start();

        oddThread.Join();
        evenThread.Join();
    }
}

1 个答案:

答案 0 :(得分:0)

正如其他人已在此处概述的那样,只有锁的当前所有者可以使用脉冲发出信号。

我强烈推荐Joe Albahari的教程。

http://www.albahari.com/threading/