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

Kit*_*ter 7 c# multithreading barrier cyclicbarrier

由于某些原因,我必须坚持使用.NET 3.5并且我需要一个来自.NET 4的Barrier类功能.我有一堆线程做了一些工作,我希望它们等待彼此直到完成所有操作.当一切都完成后,我希望他们以类似的方式一次又一次地完成工作.鼓励C#4.0中的障碍和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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到的输出如下:

'屏障'处的线程0将休眠7564线程1在'屏障'将睡眠为5123线程2在'屏障'将睡眠4237线程2在'屏障'与时间4237线程1在'屏障'时间5123线程0在'屏障'时间7564线程0在'屏障'将睡眠8641线程0在'屏障'与时间8641

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

谢谢!

Han*_*ant 5

那是因为你使用AutoResetEvent.其中一个线程的WaitAll()调用将首先完成.这会自动导致所有ARE上的Reset().这可以防止其他线程完成WaitAll()调用.

这里需要ManualResetEvent.