Tag:

如何创建自定义消息泵?

我正在做一个小练习,我需要创建一个类似于消息泵的东西。 我所拥有的是一个工作队列,我希望工作完全在一个线程上完成,而任何线程都可以将工作添加到队列中。 Queue 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周围放置昂贵的互斥量,我将如何减轻这种情况?