使用监视器进行线程同步
本文关键字:线程 同步 监视器 | 更新日期: 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/