擅长:python、mysql、java
<p>无论何时使用事件驱动架构,都需要有一个单一的机制来报告事件完成情况。在Linux上,如果使用文件,则需要使用select或poll系列中的某些内容,这意味着必须使用管道来启动所有与文件无关的事件。</p>
<p><strong>编辑</strong>:Linux有<a href="http://man7.org/linux/man-pages/man2/eventfd.2.html" rel="nofollow noreferrer">eventfd</a>和<a href="http://man7.org/linux/man-pages/man2/timerfd_create.2.html" rel="nofollow noreferrer">timerfd</a>。它们可以添加到您的<code>epoll</code>列表中,并用于分别从另一个线程或计时器事件触发时从<code>epoll_wait</code>中断。</p>
<p>还有另一个选择,那就是信号。可以使用<code>fcntl</code>修改文件描述符,以便在文件描述符变为活动时发出信号。然后,信号处理程序可以将文件就绪消息推送到您选择的任何类型的队列上。这可能是一个简单的信号量或mutex/condvar驱动的队列。由于现在不再使用<code>select</code>/<code>poll</code>,因此不再需要使用管道来对非基于文件的消息进行排队。</p>
<p>健康警告:我没有尝试过,虽然我看不出它为什么不能工作,但我并不真正知道<code>signal</code>方法的性能影响。</p>
<p>编辑:在信号处理程序中操作互斥锁可能是一个非常糟糕的主意。</p>