优先自动重置事件

时间:2011-02-24 13:23:52

标签: c# c++ multithreading winapi synchronization

我有这个问题: Thread1可能会设置自动重置事件,并且有许多线程可能会等待该事件。有没有什么方法可以指定特定事件的等待线程的优先级,也就是说,如果说事件已设置且A和B都在等待它,我想确保B可以工作,并且A将等待下一次机会。这个的任何同步对象?语言不那么重要。

先谢谢

2 个答案:

答案 0 :(得分:3)

您描述的问题需要实时调度程序和同步器。虽然我知道Windows API中存在这样的东西,但我已经尽力避免了解它们。

除非系统的其余部分是真正的实时系统,否则我的建议是使用优先级队列来推送自己的解决方案。确保每个线程在注册时将其有效优先级传递给队列,在condvar上阻塞该线程,并对其进行排列,以便在事件发生时将其传递给队列中的第一个线程。

这里可能会有一些丑陋的黑客攻击,但是如果线程数很少,你可以在每个等待的线程上做一些蛮力的东西w / one condvar并让它工作。

根据您的需要,请考虑以下事项:每个事件接收器线程都有一个关联的事件队列(可能它实际上是一个邮箱;一个1深的队列),带有互斥和condvar。当线程注册接收事件时,它们将被添加到上面的优先级队列,然后阻塞。当事件发生时,事件传递线程选择优先级最高的队列成员,将其删除,将事件通知传递给单个线程的事件队列,唤醒线程。

答案 1 :(得分:1)

如果线程A的优先级高于线程B,则调度程序将选择在大多数时间优先于B唤醒A.您可以使用SetThreadPriority来更改线程的优先级。

通常认为编写代码会更好,无论哪个线程被唤醒,相同的工作都会完成 - 最重要的工作,无论是什么。然后,调度程序可以选择最方便的线程,并完成相同的工作

如果您有多个线程,并且必须由特定线程处理事件,那么请为该线程专门设置一个事件。