1

我一直在阅读 boost thread 文档,但找不到我需要的示例。

我需要在定时线程中运行一个方法,如果它没有在几毫秒内完成,则引发超时错误。

所以我有一个名为 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。

有人可以提供一个快速的 boost::thread 示例来说明如何执行此操作。

注意:超时以毫秒为单位。getTimeout() 和 invoke() 都是纯虚拟函数,已在设备子类上实现。

4

1 回答 1

2

最简单的解决方案:invoke在单独的线程中启动并使用未来来指示调用何时完成:

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_finishtrue且仅当调用在超时之前完成时。

有趣的问题是如果不是这种情况该怎么办。您仍然需要t优雅地关闭线程,因此您需要一些机制来取消挂起的调用并join在销毁线程之前执行适当的操作。虽然理论上你可以简单地detach使用线程,但在实践中这是一个非常糟糕的主意,因为你失去了与线程交互的所有方式,并且可能例如最终导致数百个死锁线程而没有注意到。

于 2013-08-12T12:25:45.587 回答