【发布时间】:2014-06-09 20:21:04
【问题描述】:
我们有一个方法需要被频繁调用来进行一些计算(大约每秒 20 次)。这是一个同步调用。调用者需要尽快得到结果。但是这个计算过程有时花费的时间比预期的要长。我们不想更改任何其他内容。我们只是想添加一种监控机制标记应用程序当前计算超过预期时间段时超时。
我们现在有两个选择:
选项 1:
在类级别创建一个监控线程,它将在应用程序的整个生命周期内保持运行。每当调用该计算方法时,它将开始监视该计算方法的性能。调用返回时会重置:
monitorThread.startMonitoring();
doComputation();
monitorThread.stopMonitoring();
调用 startMonitoring() 时,working 标志将设置为 true,并且开始时间将设置为该 monitorThread 上的当前时间。唤醒时就可以知道当前状态是否超时。
当调用 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 选项是否适合我们:
- 我可以在类级别定义计时器并在应用程序的整个运行会话期间重用它吗?
- 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();
2。
为了重用定时器并尽量减少线程数。我应该在开始时实例化 io_service,即将boost::asio::deadline_timer timer(io_service); 放在构造函数中。并且还在一个新的专用线程中调用io_service.run();(并在调用后让它死掉)?或者只是在初始化主线程中调用它,因为 io_service.run() 无论如何都会启动一个新线程?在使用定时器的地方,下面这段代码就足够了:
timer.cancel();
timer.expires_from_now(boost::posix_time::seconds(1));
timer.async_wait(handler);
doComputation(); // <<---- may hung sometime
timer.cancel();
我说的对吗?
【问题讨论】:
标签: c++ boost boost-asio boost-thread