【问题标题】:Does boost::asio::deadline_timer use a thread for each timer?boost::asio::deadline_timer 是否为每个计时器使用一个线程?
【发布时间】:2011-01-25 06:04:52
【问题描述】:

我有一个需要在不同时间间隔更新的项目列表。该列表可以增长到数千个项目。每个项目可能具有不同的间隔。如果我为每个项目创建一个计时器,我会用线程使系统饱和吗?我在想最好创建一个等于一组项目中最小间隔的计时器,然后在每次更新时增加一个计数器,然后检查计数器现在是否等于任何其他间隔。如果最小间隔是所有其他间隔的倍数,这应该可以工作。有什么建议吗?

【问题讨论】:

    标签: c++ boost timer boost-asio boost-thread


    【解决方案1】:

    Boost 不为每个计时器使用一个线程,它保留一个计时器队列。每个计时器都是使用 boost::asio::io_service 对象创建的,它执行实际工作。

    这个对象可以在一个或多个线程中调度它的工作,when you run boost::asio::io_service::run() explicitly from multiple threads,但是定时器和线程之间没有一一对应的关系,Asio 不会在你背后创建线程。

    【讨论】:

    • 好吧,这很好,但你说它会在“一个或多个”线程中分派它的工作。默认情况下,如果我创建一千个绑定到一个 io_service 的计时器,并从一个线程在 io_service 上调用 run,那么所有这些计时器都将在一个新线程上执行吗?显然,当您调用 timer::async_wait 时,它们不会在调用线程上执行,对吗?此外,尽管有这种能力,但我所说的设计似乎比创建许多计时器更可取吗?还是我本质上是在复制计时器的功能?
    • (1) 是的,如果你从线程 A 运行 IO 服务,所有的定时器处理程序都将在线程 A 上运行。 (2) 最好创建多个定时器,因为这样更易于维护,错误更少- 比手动计算一个计时器的最短间隔更容易(您将有一对一的关系 b/w 工作项和计时器)。
    • PS 是的,你会重复 Asio 已经为你做的工作(跟踪最早到期的计时器)。
    【解决方案2】:

    Recent versions 的 Asio,Boost 1.43 及更高版本,在 Linux 上使用 timerfd_create(2) API 为 deadline_timers。

    更改为使用 timerfd 在 Linux 上调度计时器,当 可用。

    【讨论】:

      猜你喜欢
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多