gpt4 book ai didi

c++ - 使用boost线程库抛出的异常

转载 作者:行者123 更新时间:2023-11-28 07:28:44 28 4
gpt4 key购买 nike

我有以下代码来运行定时线程:

// 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 += 500; // Add 500ms to cover invocation time.

// Invoke the request within a timed thread.
boost::promise<void> boostPromise;
boost::unique_future<void> boostFuture = boostPromise.get_future();
boost::thread boostThread([&]()
{
invoke(request, response);
boostPromise.set_value();
});

// The thread has timed out, if the future is not ready.
return (boostFuture.wait_for(boost::chrono::milliseconds(timeout))
==
boost::future_status::ready);
}

这似乎没有问题,函数在超时时返回 false。

然而,被调用的代码(通过 invoke(request, response);)抛出一个异常杀死应用程序。如果线程尚未完成,我如何成功终止线程,以及消耗任何异常。

我尝试了以下方法:

// The thread has timed out, if the future is not ready.
bool completed = (boostFuture.wait_for(boost::chrono::milliseconds(timeout))
==
boost::future_status::ready);
if (!completed)
{
boostThread.interrupt();
}
return completed;

但这也会引发异常并使应用程序崩溃。我需要一个完全安全的机制如果达到超时,可以安全地终止定时线程。

最佳答案

Boost 文档说明:

如果传递给 boost::thread 构造函数的函数或可调用对象在调用时传播了一个非 boost::thread_interrupted 类型的异常,则调用 std::terminate()。

您必须捕获异常并干净地退出线程(或抛出 boost::thread_interrupted)

http://www.boost.org/doc/libs/1_54_0/doc/html/thread/thread_management.html#thread.thread_management.tutorial.exceptions

关于c++ - 使用boost线程库抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18192923/

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