select() 是一个很棒的系统调用。您可以打包任意数量的文件描述符、套接字描述符、管道等,并在输入可用时以同步方式获得通知。
有没有办法创建一个间隔/单次计时器并将其与 select() 一起使用?这将使我免于为 IO 和计时设置多个线程。
select() 是一个很棒的系统调用。您可以打包任意数量的文件描述符、套接字描述符、管道等,并在输入可用时以同步方式获得通知。
有没有办法创建一个间隔/单次计时器并将其与 select() 一起使用?这将使我免于为 IO 和计时设置多个线程。
timerfd_create正是这样做的。这是 linux 内核的一个相当新的添加,但可能尚未在所有发行版上可用。
使用 timeout 参数 - 将您的计时器事件保留在优先级队列中,检查顶部项目并相应地设置超时 - 如果达到超时,那么您可以检查事件是否已准备好运行,运行事件并继续。
至少我是这样做的。
请注意,poll 具有更好的界面(在某些方面),并且在使用大量文件描述符时可能会更有效。
MarkR 有一个很好的便携式解决方案,但这里有另一个:
使用 POSIX 计时器 ( timer_create
),您可以将问题转换为“ select
-able 信号”。这个问题有一个经典的解决方案:从信号处理程序写入管道并select
在管道的读取端进行 ing。
基于@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.