【问题标题】:Implementing timer using select使用 select 实现计时器
【发布时间】:2010-08-17 19:34:18
【问题描述】:

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

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

  • 应用线程
  • 定时器线程

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

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

解决此问题的一种方法是让选择在每个“滴答”中超时,然后检查队列中的消息。他们是更好的方法吗? 每次应用程序将消息放入select 队列以中断select 时,我还考虑引发中断。这是否适用于多线程应用程序?

平台:Unix

【问题讨论】:

标签: sockets select timer


【解决方案1】:

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

【讨论】:

  • 听起来很有趣。我会看看。谢谢
【解决方案2】:

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

【讨论】:

  • 它的 Unix。我将把它添加到问题中
  • 显然是 Linux,因为 timerfd_create(2) 是特定于 Linux 的。
【解决方案3】:

如果您使用 timerfd,则不需要专门的计时器线程,只需使用 selectpollepoll 等围绕事件循环编写应用程序。

【讨论】:

  • 实际应用有3个线程,所有线程都可以随时发出定时器请求。
猜你喜欢
  • 2017-05-31
  • 1970-01-01
  • 2011-01-20
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2013-09-05
  • 2019-11-29
相关资源
最近更新 更多