C++ 来自boost Asio截止时间计时器的多个异步等待

C++ 来自boost Asio截止时间计时器的多个异步等待,c++,boost,timer,boost-asio,C++,Boost,Timer,Boost Asio,可以在同一个boost::asio::deadline\u计时器上多次调用async\u wait吗 我的意思是这样做: t->expires_from_now(delay); t->async_wait(f1); t->async_wait(f2); 这是否确保调用这两个函数? 这是否确保按此顺序调用这两个函数 如果没有,你知道如何在计时器超时时连续调用f1和f2吗?(我不在乎在调用f1和f2之间是否执行了另一个处理程序) 另一个问题:如果设置了两个计时器t1和t2,使得t

可以在同一个boost::asio::deadline\u计时器上多次调用async\u 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创建第二个计时器,其延迟略大于为第一个计时器设置的延迟)


感谢仔细阅读上的文档,它声明

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

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

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

  • 当到期时间仅比系统时钟(或操作系统定时服务)的分辨率低一小段时间时,可能会出现问题。这种情况下的行为由计时器实现定义(但Boost的默认实现不应该有问题,请参阅注释)
  • 多线程环境中两个处理程序可能并发。将这两个处理程序包装到同一个链中,以消除与并发性相关的问题
  • 取消计时器的可能性。当后一个计时器在前一个计时器到期之前被取消时(通过设置另一个到期时间),它会在前一个计时器到期之前触发其处理程序
  • 更新:
    我刚才意识到你的第一个问题中有第二个部分,关于调用处理程序的顺序。文件中没有提到这一点。您可以在实现中查找它,但这可能会改变。
    如果希望两个函数按顺序执行,只需调用第一个函数中的第二个函数。如果第二个处理程序仅在某些情况下才“附加”到第一个处理程序,则可以延迟对
    async\u wait
    的调用,直到您知道处理程序链的整个范围,或者使它们彼此独立。

    第三种可能是滚动您自己的可附加处理程序。但请记住,处理程序被复制到
    io\u服务::run
    线程,即
    async\u wait
    调用中,因此可追加处理程序只需要一个指向实际处理程序链的指针,它需要考虑并发性等等。

    这是一个实现细节,但我认为第二个问题的第一点可能有点不准确。Asio管理
    timer\u队列
    中的计时器操作,在那里,它们根据
    Time\u Traits::less\u than
    进行排序。当反应器从队列中移除就绪计时器时,它会将它们添加到
    io\u服务中进行延迟调用,在那里它们应该按照过期的时间顺序进行,而不受系统时钟分辨率的影响。感谢您的关注。您可以阅读答案的这一部分,就像“实现定义”一样——我给出的示例可能不适用于boost的计时器实现,但它们很可能适用于其他自定义实现。我重新措辞了那部分回答听起来不错。处理程序的顺序在和类型要求中未指定。虽然将按照时间顺序对它们进行排队,而与系统时钟的分辨率无关,但这不是必需的,定制服务可以安全地按照任何顺序对它们进行排队。