由于某些原因,我必须坚持使用 .NET 3.5,并且我需要 .NET 4 中的 Barrier 类的功能。我有一堆线程在做一些工作,我希望它们互相等待,直到全部完成。当一切都完成后,我希望他们以类似的方式一次又一次地完成这项工作。C# 4.0 中的 Barrier 和 C# 3.0 中的 WaitHandle 之间的线程差异的鼓励?我决定使用 AutoResetEvent 和 WaitHandle 类来实现 Barrier 功能。尽管我的代码遇到了问题:
class Program
{
const int numOfThreads = 3;
static AutoResetEvent[] barrier = new AutoResetEvent[numOfThreads];
static Random random = new Random(System.DateTime.Now.Millisecond);
static void barriers2(object barrierObj)
{
AutoResetEvent[] barrierLocal = (AutoResetEvent[])barrierObj;
string name = Thread.CurrentThread.Name;
for (int i = 0; i < 10; i++)
{
int sleepTime = random.Next(2000, 10000);
System.Console.Out.WriteLine("Thread {0} at the 'barrier' will sleep for {1}.", name, sleepTime);
Thread.Sleep(sleepTime);
System.Console.Out.WriteLine("Thread {0} at the 'barrier' with time {1}.", name, sleepTime);
int currentId = Convert.ToInt32(name);
//for(int z = 0; z < numOfThreads; z++)
barrierLocal[currentId].Set();
WaitHandle.WaitAll(barrier);
/*
for (int k = 0; k < numOfThreads; k++)
{
if (k == currentId)
{
continue;
}
System.Console.Out.WriteLine("Thread {0} is about to wait for the singla from thread: {1}", name, k);
barrierLocal[k].WaitOne();
System.Console.Out.WriteLine("Thread {0} is about to wait for the singla from thread: {1}. done", name, k);
}
*/
}
}
static void Main(string[] args)
{
for (int i = 0; i < numOfThreads; i++)
{
barrier[i] = new AutoResetEvent(false);
}
for (int i = 0; i < numOfThreads; i++)
{
Thread t = new Thread(Program.barriers2);
t.Name = Convert.ToString(i);
t.Start(barrier);
}
}
}
我收到的输出如下:
'barrier' 处的线程 0 将休眠 7564 'barrier' 处的线程 1 将休眠 5123 'barrier' 处的线程 2 将休眠 4237 'barrier' 处的线程 2 与时间 4237'barrier'处的线程 1时间为 5123 线程 0 在“屏障”,时间为 7564 线程 0 在“屏障”将休眠 8641 线程 0 在“屏障”,时间为 8641
就是这样。在最后一行之后没有更多的输出并且应用程序不会终止。看起来有某种僵局。但是找不到问题。欢迎任何帮助。
谢谢!