4

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

谢谢

4

2 回答 2

7

仔细阅读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 的默认实现不应该是问题,请参阅注释)。
  2. 多线程环境中两个处理程序的可能并发。将两个处理程序包装到同一个链中,以解决与并发相关的问题。
  3. 取消计时器的可能性。当后一个计时器在前一个计时器到期之前被取消时(通过设置另一个到期时间),它会在前一个计时器之前触发其处理程序。

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

于 2013-04-18T15:08:49.923 回答
0

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

于 2021-08-31T00:28:29.847 回答