以下代碼使用後臺工作線程逐個處理工作項目。只要工作項目用完,工作線程就會開始等待ManualResetEvent。主線程定期添加新的工作項並喚醒工作線程。C#工作線程喚醒競爭條件
醒來機制有競爭條件。如果主線程添加新項目,而工作線程位於*指定的位置,則工作線程不會被喚醒。
是否有一種簡單且正確的方法來喚醒沒有此問題的工作線程?
ManualResetEvent m_waitEvent;
// Worker thread processes work items one by one
void WorkerThread()
{
while (true)
{
m_waitEvent.WaitOne();
bool noMoreItems = ProcessOneWorkItem();
if (noMoreItems)
{
// *
m_waitEvent.Reset(); // No more items, wait for more
}
}
}
// Main thread code that adds a new work item
AddWorkItem();
m_waitEvent.Set(); // Wake worker thread
'System.Collections.Concurrent.ConcurrentQueue'' System.Collections.Concurrent.BlockingCollection' – I4V