多个async_wait从一个boost Asio deadline_timer

Multiple async_wait from a boost Asio deadline_timer

本文关键字:boost 一个 Asio deadline timer wait async 多个      更新时间:2023-10-16

是否可以在同一个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创建第二个计时器,其延迟略大于第一个计时器设置的延迟)。

谢谢

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

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

(重点)。这意味着在您的例子中,f1和f2都将被调用一次。

对于你的第二个问题:这取决于三个条件:

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

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

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

相关文章: