来自boost Asio deadline_timer的多个async_wait

时间:2013-04-18 14:20:32

标签: c++ boost timer boost-asio

是否可以在同一个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的截止时间之前,我可以确定在与t2相关联的处理程序之前将调用与t1相关联的处理程序吗? (在这种情况下,对于上面的代码,我只是为f2创建第二个定时器,其延迟略大于第一个定时器设置的延迟)。

由于

1 个答案:

答案 0 :(得分:6)

仔细阅读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. 当到期时间仅比系统时钟(或OS'时序服务)的分辨率低一小段时间时,可能会出现问题。在这种情况下的行为是由计时器实现定义的(但不应该是Boost默认实现的问题,请参阅注释)。
  2. 多线程环境中两个处理程序的可能并发性。将两个处理程序包装在同一个链中,以避免出现与并发相关的问题。
  3. 取消计时器的可能性。当较晚的计时器在较早的计时器到期之前被取消时(通过设置另一个到期时间),它会在较早的计时器之前触发其处理程序。
  4. <强>更新
    我刚才意识到你的第一个问题中有第二部分关于处理程序被调用的顺序。文件没有说明这一点。您可以在实施中查找,但这可能会改变 如果您希望按顺序执行两个函数,只需从第一个函数调用第二个函数。如果第二个处理程序只在某些条件下被“附加”到第一个处理程序,要么将调用延迟到async_wait,直到你知道处理程序链的整个范围,或者只是使它们彼此独立。 /> 第三种可能性是推出自己的可附加处理程序。但请记住,处理程序被复制到io_service::run线程,即进入async_wait调用,因此可附加处理程序只需要一个指向真实处理程序链的指针,它需要采用并发考虑到等等。