C++ 多线程使用future传递异常
如果 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_promise 的 std::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传递异常的更多相关文章
- 多线程设计模式 - Future模式
Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...
- 13.多线程设计模式 - Future模式
多线程设计模式 - Future模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更具有意义. 1 ...
- c++多线程参数的传递
#include <iostream> #include <pthread.h> //多线程相关操作头文件,可移植众多平台 using namespace std; struc ...
- Java提高:采用异常链传递异常
一.分析 异常需要封装,但是仅仅封装还是不够的,还需要传递异常.一个系统的友好型的标识,友好的界面功能是一方面,另一方面就是系统出现非预期的情况的处理方式了. 二.场景 比如我们的JEE项目一般都又三 ...
- Java多线程学习---------超详细总结(java 多线程 同步 数据传递 )
目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么 ...
- C# 多线程參数传递
1.通过实体类来传递(能够传递多个參数与获取返回值),demo例如以下: 须要在线程中调用的函数: namespace ThreadParameterDemo { public class Funct ...
- 多线程设计模式 - Future模式之JAVA原生实现
在之前一篇博客中介绍了Future设计模式的设计思想以及具体实现,今天我们来讲一下使用JDK原生的包如何实现. JDK内置的Future主要使用到了Callable接口和FutureTask类. Ca ...
- 【多线程】Future和FutureTask以及CompletionService
Future接口 此接口主要用于: 代表异步计算的执行结果: 用于可取消的task:(比使用interrupt实现取消要方便 ) FutureTask类 FutureTask是Future的一个实现类 ...
- Java 多线程并发 Future+callable 实例
需求:一个业务实现 查询, 因为 要查询十几次, 所以每个平均0.6秒, 之前只有主线程一步步查 ,结果用了10秒,效率十分低下 , 于是改用线程池并发: 以下是代码设计: 1.线程池工具类: pac ...
随机推荐
- 渗透测试工具-sqlmap
简单来说:一个用来做sql注入攻击的工具 安装 1,下载sqlmap.zip,下载环境: 打开sqlmap官网https://github.com/sqlmapproject/sqlmap/ :下载p ...
- 关于POI相关通用方法源码
设置宽度,1个汉字的宽度 导入excel用,返回行数 sheetName是sheet,显示名 导出excel 导出excel 获得excel数据 写输出,最后用 重新单元格指定位置 移到下一行,列开头 ...
- multiselect多选下拉框
具体实现 <input type="hidden" id="q_dueDay" name="q_dueDay" value=" ...
- 关于数位DP的学习
---恢复内容开始--- 因为最近做比赛经常会出现数位DP,便尝试着去学学看数位DP. 先给出两篇论文的链接: <数位计数问题解法研究> <浅谈数位类统计问题> 然后也是寻找了 ...
- Manacher算法 & Palindrome
马拉车用于解决最长回文子串问题,重点是子串,而不是子序列,时间复杂度为O(n). 解释一下变量的意义: Len[i]数组去存第i个位置到mx位置的长度 id记录上一次操作的位置(这个操作可以看模板) ...
- POJ - 1654 利用叉积求三角形面积 去 间接求多边形面积
题意:在一个平面直角坐标系,一个点总是从原点出发,但是每次移动只能移动8个方向的中的一个并且每次移动距离只有1和√2这两种情况,最后一定会回到原点(以字母5结束),请你计算这个点所画出图形的面积 题解 ...
- hdu5375 Gray code
Problem Description The reflected binary code, also known as Gray code after Frank Gray, is a binary ...
- log4net GetLogger(source).IsInfoEnabled = false
GetLogger(source).IsInfoEnabled = false解决办法 在.net core中需要把log4net.config放到 ITCP.Web\ITCP.Web\obj\Rel ...
- 实现基于股票收盘价的时间序列的统计(用Python实现)
时间序列是按时间顺序的一组真实的数字,比如股票的交易数据.通过分析时间序列,能挖掘出这组序列背后包含的规律,从而有效地预测未来的数据.在这部分里,将讲述基于时间序列的常用统计方法. 1 用rollin ...
- oslab oranges 一个操作系统的实现 实验三 认识保护模式(二):分页
实验目的: 掌握内存分页机制 对应章节:3.3 实验内容: 1.认真阅读章节资料,掌握什么是分页机制 2. 调试代码,掌握分页机制基本方法与思路 – 代码3.22中,212行---237行,设置断点调 ...