我正在做一个小练习,我需要创建类似于消息泵的东西。我有一个工作队列要做,我希望工作完全在一个线程上完成,而任何线程都可以将工作添加到要完成的队列中。
Queue<WorkToDo> queue;
线程使用等待句柄告诉泵有工作要做。
WaitHandle signal;
只要有工作要做,泵就会循环,然后等待信号再次启动。
while(ApplicationIsRunning){
while(queue.HasWork){
DoWork(queue.NextWorkItem)
}
signal.Reset();
signal.WaitOne();
}
每个其他线程都可以向队列添加工作并发出等待句柄的信号......
public void AddWork(WorkToDo work){
queue.Add(work);
signal.Set();
}
问题是,如果添加工作的速度足够快,则可能会出现这样一种情况,即工作可以留在队列中,因为在队列检查工作和 WaitHandle 重置之间,另一个线程可以将工作添加到队列中。
我将如何减轻这种情况而不在 WaitHandle 周围放置昂贵的互斥锁?