以下のコードは、バックグラウンド ワーカー スレッドを使用して、作業項目を 1 つずつ処理します。ワーカー スレッドは、作業項目がなくなるたびに 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