我计划使用timerfd_create
在C中编写一个小型计时器库。
此库的基本用户将有两个线程
这两个线程之间会有一个队列,这样每当应用程序想要启动一个计时器时,它会将一条消息推送到队列中,然后计时器线程会读取该队列并为它创建一个FD并将其放入{{ 1}}。
上述方法的问题在于,作为单个线程的计时器线程将在select
系统调用中被阻止,并且不知道是否已在其接收队列中发布消息以启动计时器。
解决此问题的一种方法是让每次“tick”选择超时,然后检查队列中的消息。他们是更好的方法吗?
每当应用程序在select
队列中放入一条消息来中断select
时,我也会考虑引发一个中断。这对多线程应用程序有效吗?
平台:Unix
答案 0 :(得分:2)
如果您坚持让多个线程将计时器发布到位于select(2)
的专用计时器线程,那么为什么不使用eventfd(2)
或只使用旧的self-pipe trick来表示新的计时器可用。将事件文件描述符包含在可轮询集中,等待所有这些。
答案 1 :(得分:0)
您想要定位哪个平台?例如,在Windows下,有更好的方法可以在不使用select()的情况下处理它,例如PostThreadMessage()和WaitMessage()。
答案 2 :(得分:0)
如果您使用的是timerfd,那么就不需要专用的计时器线程,只需使用select
,poll
或epoll
等在事件循环中编写应用程序。< / p>