Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Linux中在多个线程上等待事件的最佳实践(如WaitForMultipleObjects)_Linux_Multithreading_Pthreads_Waitformultipleobjects - Fatal编程技术网

Linux中在多个线程上等待事件的最佳实践(如WaitForMultipleObjects)

Linux中在多个线程上等待事件的最佳实践(如WaitForMultipleObjects),linux,multithreading,pthreads,waitformultipleobjects,Linux,Multithreading,Pthreads,Waitformultipleobjects,在Windows中有APIWaitForMultipleObjects,如果在多个线程中注册了一个事件,则在事件发生时只会唤醒一个线程。我现在必须移植一个在线程池中使用它的应用程序,我正在寻找在Linux中实现这一点的最佳实践 我知道epoll可以等待FD(我可以使用pipe创建FD),但在多个线程中等待一个FD可能会在只需要一个FD时唤醒事件中的每个线程 在Linux上实现这种行为的最佳实践是什么?我真的不想将一个事件拆分为具有与工作线程一样多的FD,因为这可能会在某些系统上达到FD限制,因为

在Windows中有API
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集中的事件通知文件描述符注册为边缘触发。

非常感谢!不知什么原因,我在文件里完全读过头了!你救了我一天!非常感谢你!不知什么原因,我在文件里完全读过头了!你救了我一天!