gpt4 book ai didi

c++ - 检查 boost 定时线程是否已完成

转载 作者:行者123 更新时间:2023-11-30 04:15:39 25 4
gpt4 key购买 nike

我一直在阅读 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。

有人可以提供一个快速的 boost::thread 示例来说明如何做到这一点。

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

最佳答案

最简单的解决方案:在单独的线程中启动 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。虽然理论上您可以简单地分离线程,但在实践中这是一个非常糟糕的主意,因为您失去了与线程交互的所有方式,并且可能最终导致数百个线程死锁而没有引起注意。

关于c++ - 检查 boost 定时线程是否已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18186019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com