使用select实现计时器

时间:2010-08-17 19:34:18

标签: sockets select timer

我计划使用timerfd_create在C中编写一个小型计时器库。

此库的基本用户将有两个线程

  • 申请主题
  • 计时器线程

这两个线程之间会有一个队列,这样每当应用程序想要启动一个计时器时,它会将一条消息推送到队列中,然后计时器线程会读取该队列并为它创建一个FD并将其放入{{ 1}}。

上述方法的问题在于,作为单个线程的计时器线程将在select系统调用中被阻止,并且不知道是否已在其接收队列中发布消息以启动计时器。

解决此问题的一种方法是让每次“tick”选择超时,然后检查队列中的消息。他们是更好的方法吗? 每当应用程序在select队列中放入一条消息来中断select时,我也会考虑引发一个中断。这对多线程应用程序有效吗?

平台:Unix

3 个答案:

答案 0 :(得分:2)

如果您坚持让多个线程将计时器发布到位于select(2)的专用计时器线程,那么为什么不使用eventfd(2)或只使用旧的self-pipe trick来表示新的计时器可用。将事件文件描述符包含在可轮询集中,等待所有这些。

答案 1 :(得分:0)

您想要定位哪个平台?例如,在Windows下,有更好的方法可以在不使用select()的情况下处理它,例如PostThreadMessage()和WaitMessage()。

答案 2 :(得分:0)

如果您使用的是timerfd,那么就不需要专用的计时器线程,只需使用selectpollepoll等在事件循环中编写应用程序。< / p>