下面的代码使用后台工作线程一个一个地处理工作项。当工作项用完时,工作线程开始等待 ManualResetEvent。主线程定期添加新的工作项并唤醒工作线程。
唤醒机制具有竞争条件。如果主线程添加了一个新项目,而工作线程在 * 指示的位置,则工作线程不会被唤醒。
有没有一种简单而正确的方法来唤醒没有这个问题的工作线程?
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