【问题标题】:Why does `boost::asio::deadline_timer` allocate a `timer_queue` instance for each `deadline_timer` object?为什么`boost::asio::deadline_timer` 为每个`deadline_timer` 对象分配一个`timer_queue` 实例?
【发布时间】:2014-11-14 04:09:22
【问题描述】:

我正在研究基于 boost 1.52 的 boost::asio::deadline_timer 的实现。

the article on highscore中所述,分三部分实现:

  • deadline_timer,I/O 对象
  • deadline_timer_service,服务
  • detail::deadline_timer_service,服务实现

将有一个 deadline_timer_service 实例服务于许多 deadline_timer 对象。为每个 deadline_timer 对象创建一个 detail::deadline_timer_service 实例。此外,定时器由调度程序调度,调度程序通常是一个反应器(即大多数情况下 Linux 上的epoll_reactor)。

detail::deadline_timer_service 中有一个 timer_queue 类型的 timer_queue_ 成员,它是一个存储预定计时器的堆。这意味着每个deadline_timer 对象将有一个timer_queue 实例。多个timer_queue对象可以通过add_timer_queue()添加到调度器中,由一个类timer_queue_set管理。

我的问题是,为什么asio 创建多个队列来处理计时器?如果我们在调度器中有一个所有定时器都可以共享的定时器队列实例有什么缺点?

【问题讨论】:

  • 我不认为这就是它在 boost 中的实现方式。 “不只是提供骨架,本节开发的 Boost.Asio 扩展将类似于可用的boost::asio::deadline_timer 对象”
  • @sehe 我不是指高分链接中的示例。我的问题是关于boost::asio 中的boost::asio::deadline_timer 实现。

标签: c++ boost boost-asio


【解决方案1】:

我再次阅读代码并发现我的错误。实际关系如下:

  • basic_deadline_timer为i/o对象类型,每个deadline_timer一个实例;
  • deadline_timer_service为服务类型,io_service各1个,由basic_io_object的构造函数获取;
  • detail::deadline_timer_service 是服务实现类型,每个服务一个,每个io_serive 一个。定义为deadline_timer_service的数据成员;
  • detail::deadline_timer_service::implementation_type:定时器的实现类型,deadline_timer一个。

由于timer_queue_detail::deadline_timer_service 的成员,它也是io_service 的成员。现在对我来说看起来很合理。

高分链接好像把服务实现类型和定时器实现类型合二为一,有点误导。

【讨论】:

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