我一直在阅读boost线程文档,但找不到我需要的示例。
我需要在定时线程中运行一个方法,如果它在几毫秒内没有完成, 然后引发超时错误。
所以我有一个名为invokeWithTimeOut()的方法,如下所示:
// Method to invoke a request with a timeout.
bool devices::server::CDeviceServer::invokeWithTimeout(CDeviceClientRequest& request,
CDeviceServerResponse& response)
{
// Retrieve the timeout from the device.
int timeout = getTimeout();
timeout += 100; // Add 100ms to cover invocation time.
// TODO: insert code here.
// Invoke the request on the device.
invoke(request, response);
// Return success.
return true;
}
我需要调用invoke(request,response),如果在超时内没有完成,则该方法需要返回false。
有人可以通过快速提升::线程示例来说明如何做到这一点。
注意:超时以毫秒为单位。 getTimeout()和invoke()都是纯虚函数,已在设备子类上实现。
答案 0 :(得分:2)
最简单的解决方案:在单独的线程中启动invoke
并使用future表示调用何时完成:
boost::promise<void> p;
boost::future<void> f = p.get_future();
boost::thread t([&]() { invoke(request, response); p.set_value(); });
bool did_finish = (f.wait_for(boost::chrono::milliseconds(timeout)) == boost::future_status::ready)
当且仅当调用在超时之前完成时, did_finish
将为true
。
有趣的问题是,如果不,该怎么办。您仍然需要正常关闭线程t
,因此您需要一些机制来取消挂起的调用并在销毁线程之前执行正确的join
。理论上你可以简单地detach
线程,这在实践中是一个非常糟糕的想法,因为你失去了与线程交互的所有方法,并且可能最终导致数百个死锁线程而没有注意到。