gpt4 book ai didi

c++ - boost async_wait() 会导致一个新线程吗?

转载 作者:行者123 更新时间:2023-11-28 00:28:06 33 4
gpt4 key购买 nike

我们有一个方法需要经常调用来做一些计算(大约每秒 20 次)。这是一个同步调用。调用者需要尽快得到结果。但该计算过程有时花费的时间比预期的要长。我们不想改变其他任何东西。我们只是想添加一种监控机制来标记应用程序当前计算在超过预期时间段时超时。

我们现在有两个选择:

选项 1:

在类级别创建一个监控线程,它将在应用程序的整个生命周期内保持运行。每当调用该计算方法时,它将开始监视该计算方法的性能。返回调用时它将被重置:

   monitorThread.startMonitoring();
doComputation();
monitorThread.stopMonitoring();

调用 startMonitoring() 时,working 标志将设置为 true,并且开始时间将设置为该 monitorThread 上的当前时间。它将能够在唤醒时知道当前条件是否超时。

调用 stopMonitoring() 时,working 标志将设置为 false,monitorThread 将不会检查超时。

选项 2:

使用 boost deadline_timer:

boost::asio::deadline_timer timer(io_service);
timer.expires_from_now(boost::posix_time::seconds(1));
timer.async_wait(handler);
doComputation();
timer.cancel();

我不确定 dateline_timer 选项是否适合我们:

  1. 我能否在类级别定义计时器并在应用程序的整个运行 session 期间重用它?
  2. async_wait() 调用是否会在后台产生一个新线程?如果是,是否可以一次又一次地重用该线程?

编辑:

1.如果我在方法主体中使用以下代码,则处理程序将由当前线程调用,并且 doComputation() 也在同一线程中运行。在doComputation()挂起的情况下,handler是如何调用的?

boost::asio::deadline_timer timer(io_service);
timer.expires_from_now(boost::posix_time::seconds(1));
timer.async_wait(handler);
io_service.run(); // new added
doComputation(); // <<---- may hung sometime
timer.cancel();

为了重用定时器和最小化线程数。我应该在开始时实例化 io_service,即将 boost::asio::deadline_timer timer(io_service); 放在构造函数中。并在新的专用线程中调用 io_service.run();(并让它在调用后死掉)?或者只是在 init 主线程中调用它,因为 io_service.run() 无论如何都会启动一个新线程?在使用定时器的地方,下面的代码片段就足够了:

timer.cancel();
timer.expires_from_now(boost::posix_time::seconds(1));
timer.async_wait(handler);
doComputation(); // <<---- may hung sometime
timer.cancel();

我说得对吗?

最佳答案

can I define the timer at class level and reuse it during the entire running session of the application?

是的,您可以重新使用计时器,即调用 expires_from_now()async_wait()再次(但阅读引用资料以了解他们的行为!)。

does that async_wait() call will result in a new thread in the background? if yes, is that possible to reuse that thread again and again?

否(但无论如何这是一个实现细节)。 handler 将从运行 io_service::run() 的线程中调用。

按照您的编辑:

  1. 强烈建议查看 Asio documentation .请注意,io_service::run() 是一个阻塞 调用 - 它会阻塞,直到调用所有完成处理程序。您可以将其视为“消息循环”。通常,人们从专用线程调用它。或者,可以手动轮询 io_service,调用 poll()/poll_one()在其他一些特定于应用程序的循环中。

  2. io_service::run() 在没有更多工作时返回,即没有挂起的异步操作和完成处理程序要分派(dispatch)。为了让这个“消息循环”在你的模块的整个生命周期内运行(这样你就可以随时发出异步操作),你需要 associate io_service::work object使用 io_service

关于c++ - boost async_wait() 会导致一个新线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24128333/

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