繁体   English   中英

C#等待来自所有线程的信号,然后继续

[英]C# Wait for signals from all the threads before proceed

我正在编写一个C#程序,其中涉及多线程和多个线程之间的同步。 所有线程都需要独立执行一些迭代工作,并且在某个线程完成指定次数的迭代之后,它必须等待其他线程出现。 它们全部完成给定的迭代次数并获得一些中间结果后,它们应该执行一些同步的工作,然后再次继续执行,直到到达另一个同步点,依此类推。

这是我尝试实现的目标(一个线程应该在一个迭代之后暂停,然后等待其他迭代):

int nThreads = Environment.ProcessorCount;
Thread[] threads = new Thread[nThreads];

ManualResetEvent[] manualResetEvents = new ManualResetEvent[nThreads];
for (int i = 0; i < nThreads; i++)
{
    manualResetEvents[i] = new ManualResetEvent(false);
}

int nSteps = 5;
Random rnd = new Random();
for (int i = 0; i < nThreads; i++)
{
    int idx = i;
    threads[i] = new Thread(delegate ()
    {
        int cStep = nSteps;

        while (cStep > 0)
        {
            manualResetEvents[idx].Reset();
            Console.Write("\nThread {0} working... cStep = {1}\n", idx, cStep);

            Thread.Sleep(rnd.Next(1000));

            manualResetEvents[idx].Set();
            Console.WriteLine("\nThread {0} work done. Waiting Others...cStep = {1}\n", idx, cStep);

            WaitHandle.WaitAll(manualResetEvents);
            cStep--;
        }

    });
}

for (int i = 0; i < nThreads; i++)
{
    threads[i].Start();

}

for (int i = 0; i < nThreads; i++)
{
    threads[i].Join();
}

但是上面的代码似乎不起作用,因为出于某种原因,没有任何线程等待所有其他线程执行一次迭代。 我认为我误解了ManualResetEvent的目的或使用了错误的方式,您有何建议?

您的代码容易出现竞争状况。 在所有线程完成第一次迭代之后,仍将设置所有事件。 如果单个线程在其他线程重置其事件之前先运行了循环,则它将看到其他事件仍在设置,并尽早停止等待。

有很多方法可以解决此错误,但最适合您的解决方案是System.Threading.Barrier 它是专门针对这种情况而设计的,在这种情况下,您希望多个线程通过多步算法并行工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM