11

select() 是一个很棒的系统调用。您可以打包任意数量的文件描述符、套接字描述符、管道等,并在输入可用时以同步方式获得通知。

有没有办法创建一个间隔/单次计时器并将其与 select() 一起使用?这将使我免于为 IO 和计时设置多个线程。

4

4 回答 4

13

timerfd_create正是这样做的。这是 linux 内核的一个相当新的添加,但可能尚未在所有发行版上可用。

于 2010-02-24T17:44:02.713 回答
7

使用 timeout 参数 - 将您的计时器事件保留在优先级队列中,检查顶部项目并相应地设置超时 - 如果达到超时,那么您可以检查事件是否已准备好运行,运行事件并继续。

至少我是这样做的。

请注意,poll 具有更好的界面(在某些方面),并且在使用大量文件描述符时可能会更有效。

于 2010-02-24T22:41:28.077 回答
2

MarkR 有一个很好的便携式解决方案,但这里有另一个:

使用 POSIX 计时器 ( timer_create),您可以将问题转换为“ select-able 信号”。这个问题有一个经典的解决方案:从信号处理程序写入管道并select在管道的读取端进行 ing。

于 2011-07-23T13:26:11.883 回答
0

基于@MarkR,使用排序结构来存储回调+闭包,其中包含一个int和一个指向int的指针。如果两个整数具有相同的值,则该事件处于活动状态,否则将被丢弃。

这种方式可以简单地通过增加一个 int 来丢弃事件。也许不是最直接的解决方案,但这是我能想到的。

https://github.com/cheako/tor2web/tree/6ac67f80daaea01d14a5d07e6026e1af4258dc96/src

hextree.c contains the code for the data structure used.
schedule.c:156 is where the int is changed.
gnutls.c:197 is where the timers are created.
于 2017-11-04T05:32:15.703 回答