boost async_wait()将导致一个新线程

boost async_wait() will cause a new thread?

本文关键字:一个 新线程 线程 async wait boost      更新时间:2023-10-16

我们有一个方法,需要经常调用它来进行一些计算(大约每秒20次(。这是一个同步呼叫。调用者需要尽快得到结果。但计算过程有时需要比预期更长的时间。我们不想更改任何其他内容。我们只想添加一种监控机制来标记应用程序当前计算超过预期时间段时超时。

我们现在有两个选择:

选项1:

在类级别创建一个监视线程,它将在应用程序的整个生命周期中保持运行。无论何时调用该计算方法,它都将开始监视该计算方法的性能。返回呼叫时将重置:

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

当调用startMonitoring((时,working标志将设置为true,并且开始时间将设置为监视器线程上的当前时间。当它醒来时,它将能够知道当前条件是否超时。

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

选项2:

使用提升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. 我可以在类级别定义计时器,并在应用程序的整个运行会话中重用它吗
  2. asyncwait((调用会在后台产生一个新线程吗?如果是,是否可以一次又一次地重用该线程

编辑:

1。如果在方法体中使用以下代码,则当前线程将调用处理程序,doComputation((也在同一线程中运行。在doComputation((挂起的情况下,如何调用处理程序

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();

我说得对吗?

我可以在类级别定义计时器并在整个过程中重用它吗正在运行应用程序的会话?

是的,您可以重复使用计时器,即再次调用expires_from_now((和async_wait(((但请阅读引用以了解它们的行为!(。

async_wait((调用是否会在背景如果是,是否可以再次重用该线程再一次

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

遵循编辑

  1. 强烈建议您查看Asio文档。请注意,io_service::run()是一个阻塞调用,它会阻塞,直到调用完所有的完成处理程序。你可以把它看作一个"信息循环"。通常,从专用线程调用它。或者,可以手动轮询io_service,在其他特定于应用程序的循环中调用poll((/poll_one((。

  2. io_service::run((在没有更多工作时返回,即没有挂起的异步操作,也没有要调度的完成处理程序。为了让这个"消息循环"在模块的整个生命周期内运行(这样您就可以随时发出异步操作(,您需要将io_service::work对象与io_service关联起来。