gpt4 book ai didi

c++ - 来自 boost Asio deadline_timer 的多个 async_wait

转载 作者:太空狗 更新时间:2023-10-29 20:27:35 26 4
gpt4 key购买 nike

是否可以在同一个 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 上的文档, 它指出

For each call to async_wait(), the supplied handler will be called exactly once.

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

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

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

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

关于c++ - 来自 boost Asio deadline_timer 的多个 async_wait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16085565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com