如果 std::async 调用的函数抛出异常,那么这个异常会被存储在值的位置,同时 future 变为 ready ,如果调用 get() 会重新抛出存储的异常。

Note:

标准并没有指定原来的异常对象是被重新抛出或者拷贝后抛出,不同的编译器会做不同的选择。

对于 std::packaged_task<> 包装的函数如果抛出异常,那么处理与 std::async 一致。 std::promise<> 提供类似的机制,如果期望存储一个异常那么在 std::promise<> 对象上就需要使用 set_exception() 代替 set_value()

保存一个异常到 future 中的另外一个方式是在没有调用 std::promise<>set_xxxx 函数或者没有执行被 std::packaged_task<> 包装的任务的情况下就销毁与 future 关联的 std::promise<>std::packaged_task<>。无论哪种情况,析构函数都会存储一个错误码是 std::future_errc::broken_promisestd::future_error 异常,表示关联的 future 并没有 ready

#include <iostream>
#include <future> int main() {
// std::async
std::future<void> result1 = std::async([] {
throw std::runtime_error("runtime error.");
});
try {
result1.get();
} catch (const std::runtime_error &e) {
std::cout << "Async exception: " << e.what() << std::endl;
} std::promise<int> promise;
try {
// 正常的情况就set_value
// promise.set_value(66);
// 主动抛出一个异常进行测试
throw std::out_of_range("the value out of range.");
} catch (...) {
// 使用std::current_exception 存储被抛出的异常;
// 可以使用 std::copy_exception 存储没有被抛出的异常;
promise.set_exception(std::current_exception());
}
try {
promise.get_future().get();
} catch (const std::out_of_range &e) {
std::cout << "Promise exception: " << e.what() << std::endl;
} // 存储异常的其他方式,
// 在没有调用 std::promise的set_xxx函数
// 或者没有调用被 std::packaged_task 包装的任务情况下
// 就销毁与 future关联的 std::promise,std::packaged_task 对象 // std::packaged_task<>
std::future<void> future;
try {
// 提前销毁task
{
std::packaged_task<void()> task([] {
std::cout << "do packaged task." << std::endl;
});
future = task.get_future();
}
future.get();
}
catch (const std::future_error &e) {
std::cout << "Packaged task exception: " << e.what() << std::endl;
} // std::promise<>
try {
// 提前销毁promise
{
std::promise<void> promise;
future = promise.get_future();
}
future.get();
}
catch (const std::future_error &e) {
std::cout << "Promise exception: " << e.what() << std::endl;
} return 0;
}

更多内容:https://blog.nas-kk.top/?p=106

C++ 多线程使用future传递异常的更多相关文章

  1. 多线程设计模式 - Future模式

    Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...

  2. 13.多线程设计模式 - Future模式

    多线程设计模式 - Future模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更具有意义. 1 ...

  3. c++多线程参数的传递

    #include <iostream> #include <pthread.h> //多线程相关操作头文件,可移植众多平台 using namespace std; struc ...

  4. Java提高:采用异常链传递异常

    一.分析 异常需要封装,但是仅仅封装还是不够的,还需要传递异常.一个系统的友好型的标识,友好的界面功能是一方面,另一方面就是系统出现非预期的情况的处理方式了. 二.场景 比如我们的JEE项目一般都又三 ...

  5. Java多线程学习---------超详细总结(java 多线程 同步 数据传递 )

    目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么 ...

  6. C# 多线程參数传递

    1.通过实体类来传递(能够传递多个參数与获取返回值),demo例如以下: 须要在线程中调用的函数: namespace ThreadParameterDemo { public class Funct ...

  7. 多线程设计模式 - Future模式之JAVA原生实现

    在之前一篇博客中介绍了Future设计模式的设计思想以及具体实现,今天我们来讲一下使用JDK原生的包如何实现. JDK内置的Future主要使用到了Callable接口和FutureTask类. Ca ...

  8. 【多线程】Future和FutureTask以及CompletionService

    Future接口 此接口主要用于: 代表异步计算的执行结果: 用于可取消的task:(比使用interrupt实现取消要方便 ) FutureTask类 FutureTask是Future的一个实现类 ...

  9. Java 多线程并发 Future+callable 实例

    需求:一个业务实现 查询, 因为 要查询十几次, 所以每个平均0.6秒, 之前只有主线程一步步查 ,结果用了10秒,效率十分低下 , 于是改用线程池并发: 以下是代码设计: 1.线程池工具类: pac ...

随机推荐

  1. Spring boot AOP 实现Redis 存储

    package com.carloan.common.web.annotation; import java.lang.annotation.*; /** * 自定义redis缓存注解.只要在serv ...

  2. oracle根据日期计算星期几

    工作中用到的,在存储过程中的语句,简单记下: /** 判断输入日期是星期几 */ select decode(to_char(to_date(iv_date,'yyyy-mm-dd'), 'day') ...

  3. jenkins 简介和简单操作

    持续集成:Continuous Intergration (CI) 持续交付:Continuous Delivery(CD) 持续部署:Continuous Deployment(CD) jenkin ...

  4. CSS开发过程中的20个快速提升技巧

    摘要:本文涵盖了20个CSS技巧,可以解决许多工作中常见的问题, 让你也成为一个CSS高手. 1.使用CSS重置(reset) css重置库如normalize.css已经被使用很多年了,它们可以为你 ...

  5. linux(2)系统目录结构

    前言 平常linux系统用的也不少,那么linux下的每个目录都是用来干什么的,小伙伴们有仔细研究过吗?让我们来了解下吧 Linux 系统目录结构 登录系统后,在当前命令窗口下输入命令: [root@ ...

  6. sh 脚本名字和./脚本名字有什么区别

    sh xxx用 sh 这个shell (sh一般指系统默认shell,比如 bash, ksh, Csh 等都有可能) 来解释和运行 xxx 这个脚本.xxx 文件不必具有可执行属性(chmod +x ...

  7. 2019 ICPC 上海区域赛总结

    2019上海区域赛现场赛总结 补题情况(以下通过率为牛客提交): 题号 标题 已通过代码 通过率 我的状态 A Mr. Panda and Dominoes 点击查看 5/29 未通过 B Prefi ...

  8. HDU 1754线段树

    第一个自己动手写的线段树,1Y还是有点小激动哈(虽然是模版题) 1 #include<cstdio> 2 #include<cstring> 3 #include<alg ...

  9. 【bzoj 1202】[HNOI2005] 狡猾的商人(图论--带权并查集+前缀和)

    题意:一个账本记录了N个月以来的收入情况,现在有一个侦探员不同时间偷看到M段时间内的总收入,问这个账本是否为假账. 解法:带权并查集+前缀和.   判断账本真假是通过之前可算到的答案与当前读入的值是否 ...

  10. qmh的测试1

    题目:传送门 首先输入一个n,之后输入n个数a(1<=a<=1e7),对这n个数排序后,你需要找到所有的它们连续的长度.把这些连续的长度排序后输出 输入 输入: 8 1 5 2 7 4 5 ...