使用监视器进行线程同步

本文关键字:线程 同步 监视器 | 更新日期: 2023-09-27 17:51:21

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

下面是我到目前为止想出的,它遇到了死锁。我如何纠正这个问题?另外,请帮助我理解发送给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();
    }
}

使用监视器进行线程同步

正如其他人已经在这里概述的那样,只有锁的当前所有者才能使用脉冲发出信号。

我强烈推荐Joe Albahari的教程。

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