优先自动重置事件
Posted
技术标签:
【中文标题】优先自动重置事件【英文标题】:Prioritized Auto-Reset Event 【发布时间】:2011-07-03 13:52:07 【问题描述】:我有这个问题: Thread1 可能会设置一个自动重置事件,并且有许多线程可能会等待该事件。有什么方法可以为特定事件指定等待线程的优先级,也就是说,如果说事件已设置并且 A 和 B 都在等待它,我想确保 B 将工作,并且 A 将等待下一次机会。有任何同步对象吗?语言不是那么相关。
提前致谢
【问题讨论】:
事件是先进先出的,不是你想要的。创建一个优先队列,解锁头部。 【参考方案1】:您描述的问题需要实时调度器和同步器。虽然我知道 Windows API 中存在这样的东西,但我已经非常努力地避免知道它们。
除非系统的其余部分是真正的实时系统,否则我的建议是使用优先级队列推出您自己的解决方案。确保每个线程在注册时将其有效优先级传达给队列,在 condvar 上阻塞该线程,并对其进行安排,以便在事件发生时仅将其传递给队列中的第一个线程。
这里可能有一些丑陋的黑客攻击,但如果线程数很少,您可以使用每个等待线程的一个 condvar 进行某种蛮力操作并使其工作。
根据您的需要,考虑一下:每个事件接收器线程都有一个关联的事件队列(也许它真的是一个邮箱;一个深度为 1 的队列),带有互斥锁和 condvar。当线程注册接收事件时,它们会被添加到上面的优先级队列中,然后阻塞。当事件发生时,事件传递线程选择最高优先级的队列成员,将其移除,将事件通知传递到各个线程的事件队列,唤醒线程。
【讨论】:
+1 - 好主意。此外,如果有很多等待线程但只有几个优先级,您可以每个优先级有一个事件,而不是在内部每个线程有一个事件。 @贾斯汀,同意。解决方案的许多细节取决于线程数、其他事件数、频率、这是一对一还是一对多信号等。【参考方案2】:如果线程 A 的优先级高于线程 B,则调度程序将在大多数情况下优先选择唤醒 A 而不是 B。您可以使用SetThreadPriority
更改线程的优先级。
通常认为编写代码更好,这样无论哪个线程被唤醒,都可以完成相同的工作 --- 最重要的工作,不管是什么。然后,调度器可以选择最方便的线程,完成同样的工作
如果您有多个线程,并且事件必须由特定线程处理,则为该线程设置一个专门的事件。
【讨论】:
是的,我知道,谢谢,但是“大部分时间”对我来说还不够以上是关于优先自动重置事件的主要内容,如果未能解决你的问题,请参考以下文章