2010-08-17 98 views
0

我打算使用timerfd_create以C语言编写一个小型计时器库。使用select实现计时器

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

  • 应用程序线程
  • 计时器线程

将会有这两个线程之间的队列,以便每当应用程序要启动一个计时器,它会将消息推送到计时器线程将读取的队列中,并为其创建一个FD并将其放入select

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

解决此问题的一种方法是让选择超时每“滴答”一次,然后检查队列中的消息。他们是更好的方法来做到这一点? 我也想过在每次应用程序在select队列中放置一条消息以中断select时引发中断。这对多线程应用程序有效吗?

平台:Unix

+0

你计划如何计时器和应用程序线程交互? – 2010-08-18 09:22:04

+0

通过两个线程之间的队列 – 2010-08-18 13:12:59

+0

请参阅:https://stackoverflow.com/q/2328127/1153319 – 2017-11-04 05:12:42

回答

0

您想要定位哪个平台?例如,在Windows下,没有使用select()(如PostThreadMessage()和WaitMessage())可以处理这个问题。

+0

其Unix。我将这个问题加到 – 2010-08-18 04:34:47

+0

这显然是Linux,因为'timerfd_create(2)'是Linux专用的。 – 2010-08-18 23:47:31

0

如果您正在使用timerfd的那么就没有必要使用专用计时器线程,采用selectpoll,或epoll

+0

实际应用程序有3个线程,所有这些线程都可以随时发出计时器请求。听起来很有意思的是 – 2010-08-18 13:13:44

2

只写围绕一个事件循环的应用程序。如果你坚持有多个线程发布定时器到一个专门的定时器线程坐在select(2),那么为什么不使用eventfd(2)或只是一个老好的self-pipe trick表示新的定时器可用。将事件文件描述符包含到可轮询集中,等待所有这些集合。

+0

。我会看一看。谢谢 – 2010-08-19 20:35:57