gpt4 book ai didi

c# - 如何在 .NET 3.5 中从 .NET 4 功能实现 Barrier 类

转载 作者:太空狗 更新时间:2023-10-29 20:14:37 25 4
gpt4 key购买 nike

出于某些原因,我必须坚持使用 .NET 3.5,并且我需要 .NET 4 中的 Barrier 类的功能。我有一堆线程在做一些工作,我希望它们互相等待直到全部完成.当一切都完成后,我希望他们以类似的方式一次又一次地完成这项工作。受到线程的鼓励 Difference between Barrier in C# 4.0 and WaitHandle in C# 3.0?我决定使用 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);
}
}
}

我收到的输出如下:

“屏障”处的线程 0 将休眠 7564“屏障”处的线程 1 将休眠 5123“屏障”处的线程 2 将休眠 4237时间为 4237 的“障碍”处的线程 2时间为 5123 的“障碍”处的线程 1时间为 7564 的“障碍”处的线程 0“屏障”处的线程 0 将休眠 8641时间为 8641 的“障碍”处的线程 0

就是这样。最后一行之后不再有输出,应用程序也不会终止。看起来有某种僵局。但是找不到问题。欢迎任何帮助。

谢谢!

最佳答案

那是因为您使用了 AutoResetEvent。线程的 WaitAll() 调用之一将首先完成。这会自动导致所有 ARE 上的 Reset()。这会阻止其他线程完成它们的 WaitAll() 调用。

这里需要一个 ManualResetEvent。

关于c# - 如何在 .NET 3.5 中从 .NET 4 功能实现 Barrier 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6889837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com