我目前使用ManualResetEvent爲單個線程等待多個線程添加一些東西到一個線程管理器的隊列。如果線程管理器使用手動重置事件接收到信號,它將使添加的項目出列並進行進一步處理。我唯一的問題是,如果有多個設置被觸發,那麼其他隊列項目將不會被處理。 (見B點)ManualResetEvent大小檢查是否足以等待多個線程?
while (IsThreadRunning)
{
// A: My workaround is to check if queue has item, if not then wait for other thread to set the event
if (DataQueue.Count <= 0)
{
ResetEvent.WaitOne();
}
// B: At this point two thread added item to the queue and did ResetEvent.Set() twice.
if (DataQueue.Count > 0)
{
DataQueue.Dequeue();
}
// Reset the event to avoid processor hog
ResetEvent.Reset();
}
我就在這裏解決方法是在A點加入隊列大小條件。 有沒有另一種方法來執行此操作以避免死鎖?
注意:關於使用ManualResetEvent的例子的常見場景是有多個線程在單個線程上等待(ManualResetEvent.Wait)事件,但這裏有多個線程觸發(ManualResetEvent.Set)事件。是否有其他課程用於此場景?
爲什麼不簡單地改變你的第二,如果一段時間? – 2012-02-28 01:40:02