如果 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. 基础知识——TCP协议

    七层网络模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层. 五层网络模型: 1. 应用层:确定进程之间通信的性质以满足用户需求.(各种传输协议) 2. 运输层:负责主机间不同进程的通信 ...

  2. linux git 命了

    #拉取远程分支代码到本地git clone -b 分支名称 sshGit路径 #更新远程代码到本地git pull #提交本地修改的代码到本地仓库git commit -m "自动打包&qu ...

  3. XV6学习(11)Lab thread: Multithreading

    代码放在github上. 这一次实验感觉挺简单的,特别是后面两个小实验.主要就是对多线程和锁进行一个学习. Uthread: switching between threads 这一个实验是要实现一个 ...

  4. [WPF 学习] 18. 摄像头(肢解DirectShow)

    公司的产品需要人脸比对,摄像头相关的需求如下(突然发现除了英文不太好外,实际上中文也不太好,所以直接上一个接口) using System; using System.Drawing; using S ...

  5. 2020牛客暑期多校训练营(第二场)Fake Maxpooling

    传送门:Fake Maxpooling 题意:给出矩阵的行数n和列数m,矩阵 Aij = lcm( i , j )  ,求每个大小为k*k的子矩阵的最大值的和. 题解:如果暴力求解肯定会t,所以要智取 ...

  6. Codeforces Round #644 (Div. 3)

    比赛链接:https://codeforces.com/contest/1360 A - Minimal Square 题意 计算能包含两个 $a \times b$ 矩形的最小正方形的面积. 题解 ...

  7. poj 1696 极角排序(解题报告)

    #include<iostream> #include<cmath> #include<algorithm> using namespace std; double ...

  8. Codeforces Round #565 (Div. 3) C. Lose it! (思维)

    题意:给你一串只含\(4,8,15,16,23,42\)的序列,如果它满足长度是\(6\)的倍数并且有\(\frac {k}{6}\)个子序列是\([4,8,15,16,23,42]\),则定义它是好 ...

  9. Codeforces Round #653 (Div. 3) E1. Reading Books (easy version) (贪心,模拟)

    题意:有\(n\)本书,A和B都至少要从喜欢的书里面读\(k\)本书,如果一本书两人都喜欢的话,那么他们就可以一起读来节省时间,问最少多长时间两人都能够读完\(k\)本书. 题解:我们可以分\(3\) ...

  10. Maven与Nexus3.x环境构建详解

    一.Maven介绍Apache Maven是一个创新的软件项目管理和综合工具.Maven提供了一个基于项目对象模型(POM)文件的新概念来管理项目的构建,可以从一个中心资料片管理项目构建,报告和文件. ...