boost async_wait()将导致一个新线程
boost async_wait() will cause a new thread?
我们有一个方法,需要经常调用它来进行一些计算(大约每秒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选项是否适用于我们:
- 我可以在类级别定义计时器,并在应用程序的整个运行会话中重用它吗
- 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()
的线程中调用。
遵循编辑:
-
强烈建议您查看Asio文档。请注意,
io_service::run()
是一个阻塞调用,它会阻塞,直到调用完所有的完成处理程序。你可以把它看作一个"信息循环"。通常,从专用线程调用它。或者,可以手动轮询io_service
,在其他特定于应用程序的循环中调用poll((/poll_one((。 -
io_service::run((在没有更多工作时返回,即没有挂起的异步操作,也没有要调度的完成处理程序。为了让这个"消息循环"在模块的整个生命周期内运行(这样您就可以随时发出异步操作(,您需要将
io_service::work
对象与io_service
关联起来。
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- Zmq 上下文 - 我应该在新线程中创建另一个上下文吗?
- 创建一个没有父级的新Qt窗口是否也会创建一个新线程
- 如何使一个方法在新线程中调用同一类中的另一个方法
- 最少的工作量值得生成一个新线程
- 使用Qt4.8中的C创建一个新线程
- OpenMP - 在每次循环迭代中启动一个新线程
- 一旦另一个线程完成,就会生成一个新线程
- CWnd::create 会生成一个新线程吗?
- 获取一个主程序,在一个新线程中启动一个从程序
- 如何使用boost::bind将io_service对象传递给一个新线程
- Qt每隔一秒创建一个新线程
- 在新线程中创建一个对话框
- 是否有可能在线程下创建一个新线程
- boost async_wait()将导致一个新线程
- 只在前一个线程完成时创建一个新线程
- 如何从JNI启动一个新线程
- 当添加一个用于监听网络的新线程时,应用程序冻结
- 应该在 ServiceMain 上创建一个新线程
- 为什么 boost::future:<T>:then() 会生成一个新线程?