我有一个多线程的 epoll 服务器。我创建了一个 epoll fd,然后我将有 X 个线程休眠,等待来自SAME epoll fd的epoll_wait()
任何事件。
现在我的问题是:如何唤醒 N 个线程,N > 1 && N < X?
到目前为止,我一直在使用 Linux 特定的 eventfd 工具,它只使用 1 个线程就可以很好地工作,但是现在有多个线程等待SAME epoll fd,出现了一个问题:
案例 1) LT:如果我使用“级别触发”模式添加我的 eventfd,当我写入 eventfd 时,所有线程都会唤醒,这就是级别触发模式的工作方式:一旦 fd 更改状态,让我们唤醒所有线程。
N = X
案例 2) ET:如果我使用“边缘触发”模式添加我的 eventfd,当我写入 eventfd 时只有 1 个线程会唤醒,这就是边缘触发模式的工作原理:在我收到EAGAIN
来自read(eventfd, ...);
.
N = 1
案例3)我也尝试过使用自管道技巧,向管道写入N次会唤醒N个线程。相反,它不起作用:它不可靠,有时一个线程从管道中读取 2 个“令牌”,有时是 1 或 3 个。
N = 随机
在我尝试过的所有情况下,我不能只得到 N=N,我不能只唤醒 N 个线程,而是 1 或 ALL,或 RANDOM。我错过了什么?有什么想法吗?注意:我也尝试了 eventfd 特定的EFD_SEMAPHORE
标志,没有任何帮助。