[英]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.