select()是一个很棒的系统调用。您可以打包任意数量的文件描述符,套接字描述符,管道等,并在输入可用时以同步方式获得通知。
有没有办法创建一个interval / oneshot计时器并与select()一起使用?这将使我免于拥有多个线程用于IO和计时。
答案 0 :(得分:12)
timerfd_create就是这样做的。这是Linux内核的一个新增功能,但可能并不适用于所有发行版。
答案 1 :(得分:7)
使用timeout参数 - 将计时器事件保存在优先级队列中,检查顶部项并相应地设置超时 - 如果达到超时,则可以检查事件是否准备好运行,运行事件并继续
至少我就是这么做的。
请注意,poll有一个更好的界面(在某些方面),并且可能更有效地使用大量文件描述符。
答案 2 :(得分:2)
MarkR有一个很好的便携式解决方案,但这是另一个:
使用POSIX计时器(timer_create
),您可以将问题转换为“select
- 能够发出信号”。这个问题有一个经典的解决方案:从信号处理程序写入管道,并在管道的读取端select
。
答案 3 :(得分: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.