Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 优先自动重置事件_C#_C++_Multithreading_Winapi_Synchronization - Fatal编程技术网

C# 优先自动重置事件

C# 优先自动重置事件,c#,c++,multithreading,winapi,synchronization,C#,C++,Multithreading,Winapi,Synchronization,我有一个问题: Thread1可能会设置自动重置事件,并且有许多线程可能会等待该事件。是否有任何方法可以为特定事件指定等待线程的优先级,也就是说,如果设置了事件并且A和B都在等待它,我想确保B将工作,A将等待下一次机会。有这个的同步对象吗?语言没有那么重要 提前感谢如果线程A的优先级高于线程B,那么调度程序将在大多数时间优先唤醒A而不是B。您可以使用更改线程的优先级 通常认为编写代码更好,这样无论哪个线程被唤醒,都能完成相同的工作——最重要的工作,不管是什么。然后,调度器可以选择对它来说最方便的

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


提前感谢

如果线程A的优先级高于线程B,那么调度程序将在大多数时间优先唤醒A而不是B。您可以使用更改线程的优先级

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


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

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

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

这里可能会有一些丑陋的黑客行为,但是如果线程数很低,你可以做一些暴力的事情,每个等待的线程一个condvar,然后让它工作


取决于你需要什么,考虑一下:每个事件接收器线程都有一个相关的事件队列(可能是邮箱,一个深度队列),带有互斥和CONDVAR。当线程注册以接收事件时,它们将如上所述添加到优先级队列中,然后阻塞。当事件发生时,事件传递线程选择优先级最高的队列成员,将其删除,将事件通知传递到各个线程的事件队列,唤醒线程。

是的,我知道,谢谢,但是“大多数时间”对我来说还不够+1-好主意。另外,如果有很多等待的线程,但只有几个优先级,那么每个优先级可以有一个事件,而不是每个线程内部有一个事件。@Justin同意。解决方案的许多细节取决于有多少线程、有多少其他事件、发生频率、这是一个一个还是一个多个信号等。事件是FIFO,而不是您想要的。创建优先级队列,取消阻止标头。