- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有一个调用不稳定的第三方服务的方法,所以我为这个调用添加了一个超时时间,比如 10 秒。这是我尝试过的:
int process()
{
std::promise<int> promise;
std::future<int> future = promise.get_future();
std::thread([&]
{
try
{
int result = call_third_party_service();
promise.set_value(result);
}
catch (std::exception&) //call_thrid_party_service can throw exceptions
{
promise.set_exception(std::current_exception());
}
}).detach();
auto status = future.wait_for(std::chrono::seconds(10));
if (status == std::future_status::timeout)
{
promise.set_exception(time_out_exception);
}
return future.get();
}
int main()
{
try
{
int result = process();
}
catch(const std::exception& e)
{
//print
}
//blocks the thread to see what happens
std::this_thread::sleep_for(std::chrono::minutes(1));
return 0;
}
当 call_third_party_service
没有响应时(假设它在 30 秒后抛出异常提示超时),status == std::future_status::timeout
在 10 秒后命中等待,然后 promise.set_exception
工作,一切看起来都很好。但是,当 call_third_party_service
抛出异常时,promise.set_exception
再次抛出,因此出现 Segmentation 错误。实现此模式的正确方法是什么?
最佳答案
根据Frax
的建议,您应该将promise
移到lambda中,并在future
超时时直接抛出异常:
int process() {
std::promise<int> promise;
std::future<int> future = promise.get_future();
// move ownership of the promise into thread
std::thread([prom = std::move(promise)]() mutable {
try {
int result = call_third_party_service();
prom.set_value(result);
} catch (std::exception&) // call_thrid_party_service can throw exceptions
{
prom.set_exception(std::current_exception());
}
}).detach();
auto status = future.wait_for(std::chrono::seconds(10));
if (status == std::future_status::timeout) {
// This exception is not part of an asynchronous computation and
// should be thrown immediately
throw time_out_exception("timed out");
}
return future.get();
}
int main() {
try {
int result = process();
} catch (const std::exception& e) {
// print
}
// blocks the thread to see what happens
std::this_thread::sleep_for(std::chrono::minutes(1));
return 0;
}
关于c++ - std::promise set_exception 两次导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55915552/
尝试编译以下代码时出现错误: #include #include int _tmain(int argc, _TCHAR* argv[]) { boost::promise pr;
假设我有一个调用不稳定的第三方服务的方法,所以我为这个调用添加了一个超时时间,比如 10 秒。这是我尝试过的: int process() { std::promise promise;
我在几个地方找到了关于如何使用 promise 的引用 copy_exception,但我在当前的 FDIS 中找不到它。自从那些博客以来,是否有关于如何使用 set_exception() 的替代方
我是一名优秀的程序员,十分优秀!