我正在处理一个项目,其中主服务器线程需要将事件分派到一系列工作线程。在工作线程中进行的工作依赖于轮询(即根据所讨论的UNIX系统的epoll或kqueue),这些操作需要处理时超时。这意味着一个正常的条件变量或信号量结构对于这个分派是不可行的,因为它会使得一个或另一个分组导致处理来自轮询的事件或源自服务器线程的事件之间的不希望的等待时间。线程之间的可轮询信号
所以,我想知道什么最优化的构造以可调节的方式在线程之间分派这样的事件是?实质上,所有需要传递的信息都是一个可信的“信号”,告诉工作者线程,它有更多的事件要获取。我研究过使用UNIX管道(未命名的,因为它在进程内部),这似乎是一个体面的解决方案,因为可以将单个字节写入管道并在队列清除时读回 - 但是,我想知道这是否是最好的方法?还是最快?
或者,可以在Linux上使用signalfd(2),但由于BSD系统上没有此功能,所以我宁愿避免这种构造。我也想知道使用系统信号的开销实际上有多大?
我重读了你的问题几次,我对你的问题仍然有点模糊......这听起来像工作线程有一些死亡时间(等待一个管道或什么的)和...这是我迷路了。为什么死亡时间是相关的?不是你只是想等他们完成他们的工作吗? – Owen
线程从哪里获取数据?如果我误解了这个问题,我很抱歉,但是,如果只是轮询线程读取poll(2)调用的任何输入源会出现什么问题? –
显然我的解释刚刚被删除,所以在这里。工作线程处理套接字I/O和异步磁盘I/O,这意味着它始终等待事件排队机制(epoll/kqueue)。问题是,新任务也交给了线程,但由于这些任务不一定依赖于I/O,我不能简单地将它们引入特定工作线程的事件循环中。 因此,我必须找到一种方法来在此事件轮询循环中通知工作人员,以确保新的应用程序事件可以处理。否则,我会浪费时间在其中一方。 –