Linux中在多个线程上等待事件的最佳实践(如WaitForMultipleObjects)
在Windows中有APILinux中在多个线程上等待事件的最佳实践(如WaitForMultipleObjects),linux,multithreading,pthreads,waitformultipleobjects,Linux,Multithreading,Pthreads,Waitformultipleobjects,在Windows中有APIWaitForMultipleObjects,如果在多个线程中注册了一个事件,则在事件发生时只会唤醒一个线程。我现在必须移植一个在线程池中使用它的应用程序,我正在寻找在Linux中实现这一点的最佳实践 我知道epoll可以等待FD(我可以使用pipe创建FD),但在多个线程中等待一个FD可能会在只需要一个FD时唤醒事件中的每个线程 在Linux上实现这种行为的最佳实践是什么?我真的不想将一个事件拆分为具有与工作线程一样多的FD,因为这可能会在某些系统上达到FD限制,因为
WaitForMultipleObjects
,如果在多个线程中注册了一个事件,则在事件发生时只会唤醒一个线程。我现在必须移植一个在线程池中使用它的应用程序,我正在寻找在Linux中实现这一点的最佳实践
我知道epoll
可以等待FD(我可以使用pipe
创建FD),但在多个线程中等待一个FD可能会在只需要一个FD时唤醒事件中的每个线程
在Linux上实现这种行为的最佳实践是什么?我真的不想将一个事件拆分为具有与工作线程一样多的FD,因为这可能会在某些系统上达到FD限制,因为我有许多事件(所有事件都将被拆分)
我考虑的是创建一个主线程,将工作委托给一个可用的工作线程(如果所有工作线程都在工作,则将任务排队),但这意味着我有一个额外的上下文切换(从而放弃计算时间),因为主线程将唤醒,然后唤醒另一个工作线程。如果没有其他可能干净地实现这一点,我会这样做。不幸的是,我无法摆脱当前的体系结构,所以我需要绕开它
是否有适用于这类问题的API?
<代码> EPOLILE()/代码>是正确的解决方案,尽管您可以考虑使用<代码>事件(<)/代码>文件描述符,而不考虑事件信令的<代码> PIPEE()/<代码>文件描述符。请参见以下内容:
如果多个线程(或进程,如果子进程已继承fork(2)
)中的epoll
文件描述符被阻止
epoll\u wait(2)
等待相同的epoll
文件描述符
以及兴趣列表中标记为
边缘触发(EPOLLET
)通知准备就绪,只是
线程(或进程)从epoll\u wait(2)
唤醒。这就提供了
在某些情况下避免“雷鸣群”唤醒的有用优化
情景
<> P>为了获得这个单唤醒行为,您必须在同一个EPOL描述符中的每个线程中调用<代码> ePulsWaIT(<代码>),并且您必须将EPOLL集合中的事件通知文件描述符注册为边沿触发。<代码> EPOLILE()/代码>是正确的解决方案,尽管您可以考虑使用<代码>事件()。文件描述符,而不是事件信号的pipe()
文件描述符。请参见以下内容:
如果多个线程(或进程,如果子进程已继承
fork(2)
)中的epoll
文件描述符被阻止
epoll\u wait(2)
等待相同的epoll
文件描述符
以及兴趣列表中标记为
边缘触发(EPOLLET
)通知准备就绪,只是
线程(或进程)从epoll\u wait(2)
唤醒。这就提供了
在某些情况下避免“雷鸣群”唤醒的有用优化
情景
因此,要获得此单一唤醒行为,您必须在同一个epoll描述符上的每个线程中调用
epoll\u wait()
,并且您必须将epoll集中的事件通知文件描述符注册为边缘触发。非常感谢!不知什么原因,我在文件里完全读过头了!你救了我一天!非常感谢你!不知什么原因,我在文件里完全读过头了!你救了我一天!