【问题标题】:Multiple async_wait from a boost Asio deadline_timer来自boost Asio的多个async_wait_deadline_timer
【发布时间】:2021-08-31 08:28:29
【问题描述】:

是否可以在同一个 boost::asio::deadline_timer 上多次调用 async_wait?

我的意思是这样的:

t->expires_from_now(delay);
t->async_wait(f1);
t->async_wait(f2);

这是否可以确保调用这两个函数? 这是否确保这两个函数将按此顺序调用?

如果没有,知道如何在计时器超时时连续调用 f1 和 f2 吗? (我不在乎是否在调用 f1 和 f2 之间执行了另一个处理程序)。

另一个问题:如果设置了两个定时器 t1 和 t2,使得 t1 的截止日期在 t2 的截止日期之前,我可以确定与 t1 关联的处理程序将在与 t2 关联的处理程序之前被调用吗? (在这种情况下,对于上述代码,我将为 f2 创建第二个计时器,其延迟略大于为第一个计时器设置的延迟)。

谢谢

【问题讨论】:

    标签: c++ boost timer boost-asio


    【解决方案1】:

    仔细阅读http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/basic_deadline_timer/async_wait.html 上的文档,它指出

    对于每个async_wait()的调用,提供的处理程序将只调用一次

    (强调我的)。这意味着在您的情况下, f1 和 f2 都将被调用一次。

    关于你的第二个问题:这取决于 3 个条件:

    1. 当到期时间仅相差一小段时间,低于系统时钟(或操作系统的计时服务)的分辨率时,可能会出现问题。这种情况下的行为是由计时器实现定义的(但对于 Boost 的默认实现来说应该不会有问题,请参阅 cmets)。
    2. 多线程环境中两个处理程序的可能并发。将两个处理程序包装到同一条链中,以解决与并发相关的问题。
    3. 取消计时器的可能性。如果后一个计时器在前一个计时器到期之前被取消(通过设置另一个到期时间),它会在前一个计时器之前触发其处理程序。

    更新:
    我刚刚意识到,您的第一个问题中有第二部分是关于调用处理程序的顺序。文件没有说明这一点。您可以在实现中查找它,但这可能会改变。
    如果您希望按顺序执行两个函数,只需从第一个调用第二个。如果第二个处理程序仅在某些情况下才应“附加”到第一个处理程序,请延迟对async_wait 的调用,直到您知道处理程序链的整个范围,或者只是使它们彼此独立。
    第三种可能性是滚动您自己的可附加处理程序。但请记住,处理程序被复制到io_service::run 线程中,即复制到async_wait 调用中,因此可附加处理程序只需要一个指向实际处理程序链的指针,它需要考虑并发性等开。

    【讨论】:

    • 这是一个实现细节,但我认为第二个问题的第一点可能有点不准确。 Boost.Asio 在timer_queue 中管理定时器操作,它们根据Time_Traits::less_than 进行排序。当反应器从队列中删除就绪计时器时,它会将它们添加到io_service 以进行延迟调用,它们应该按到期时间顺序排列,与系统时钟的分辨率无关。
    • 感谢您对此进行调查。您可以像“定义实现”一样阅读答案的那一部分——我给出的示例可能不适用于 boost 的计时器实现,但它们很可能适用于其他自定义实现。我改写了答案的那部分
    • 听起来不错。 WaitableTimerServiceTimerService 类型要求中未指定处理程序的顺序。虽然deadline_timer_service 将按时间顺序对它们进行排队,而与系统时钟的分辨率无关,但这不是必需的,自定义服务可以安全地以任何顺序对它们进行排队。
    【解决方案2】:

    评分最高的答案是您问题的第一部分。对于排序(正如其他人指出的那样),deadline_timer 可能会按时间顺序排列它们,但不能保证。 boost::asio 建议将操作包装在一个链中以强制排序。

    【讨论】:

    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    相关资源
    最近更新 更多