簡體   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