优先自动重置事件

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 更改线程的优先级。

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

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

【讨论】:

是的,我知道,谢谢,但是“大部分时间”对我来说还不够

以上是关于优先自动重置事件的主要内容,如果未能解决你的问题,请参考以下文章

线程同步之事件

基于事件触发PowerShell重置文件权限

在primefaces autocomplete事件中将值重置为null

多线程编程中的EventWaitHandler

touch和click优先性

怎么给wpf添加一个窗体加载事件