c/c++ 多线程 等待一次性事件 异常处理
多线程 等待一次性事件 异常处理
背景:假设某个future在等待另一个线程结束,但是在被future等待的线程里发生了异常(throw一个异常A),这时怎么处理。
结果:假设发生了上面的场景,则在调用future的get方法时,就会得到被future等待的线程抛出的异常A。
3种情况:
1,std::async
2,std::packaged_task
3,std::promise,知道发生异常了,可以不调用set_value,而是调用set_exception(std::current_exception());
代码:
#include <iostream>
#include <string>
#include <future>
class A{
int data;
public:
A(int d = 10) : data(d){}
int _data() const {return data;}
};
double div1(double a, double b){
if(b == 0){
//throw std::string("error");//进入string的catch
//throw "error";//进入const char*的catch
//throw 1;//进入int的catch
throw A(101);//进入A a的catch
}
return a / b;
}
double div2(std::promise<double>& pro, double a, double b){
int x;
std::cin.exceptions (std::ios::failbit); //如果不加这句,std::cin >> x这里,即使给的不是数字,也不会发生异常。
try{
std::cin >> x;//输入一个字母,就会引发异常
}catch(std::exception&){
pro.set_exception(std::current_exception());
}
}
int main(){
try{
//std::asnyc 执行这段时,把后面的std::package_task和std::promise注释掉
std::future<double> f = std::async(div1, 10, 0);
std::cout << f.get() << std::endl;//get如果发生了异常,则进入catch
//std::package_task 执行这段时,把std::asnyc和td::promise注释掉
std::packaged_task<double(double, double)> t(div1);
std::future<double> f2 = t.get_future();
std::thread thread1(std::ref(t), 100, 0);
thread1.detach();
f2.get();//get如果发生了异常,则进入catch
//std::promise 执行这段时,把上面的std::asnyc和td::package_task注释掉
std::promise<double> pro;
std::future<double> f3 = pro.get_future();
std::thread thread2(div2, std::ref(pro), 100, 0);
thread2.join();
f3.get();////get如果发生了异常,则进入catch(...)部分
}
catch(A a){
std::cout << "err:A a" << std::endl;
std::cout << a._data() << std::endl;
}
catch(int a){
std::cout << "err:int" << std::endl;
std::cout << a << std::endl;
}
catch(const char* s){
std::cout << "err:char*" << std::endl;
std::cout << s << std::endl;
}
catch(std::string s){
std::cout << "err:string" << std::endl;
std::cout << s << std::endl;
}
catch(...){
using namespace std;
cout << "...." << endl;
}
}
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
c/c++ 多线程 等待一次性事件 异常处理的更多相关文章
- c/c++ 多线程 等待一次性事件 std::promise用法
多线程 等待一次性事件 std::promise用法 背景:不是很明白,不知道为了解决什么业务场景,感觉std::async可以优雅的搞定一切的一次等待性事件,为什么还有个std::promise. ...
- c/c++ 多线程 等待一次性事件 packaged_task用法
多线程 等待一次性事件 packaged_task用法 背景:不是很明白,不知道为了解决什么业务场景,感觉std::asynck可以优雅的搞定一切,一次等待性事件,为什么还有个packaged_tas ...
- c/c++ 多线程 等待一次性事件 future概念
多线程 等待一次性事件 future概念 背景:有时候,一个线程只等待另一个线程一次,而且需要它等待的线程的返回值. 案例:滴滴叫车时,点完了叫车按钮后,叫车的后台线程就启动了,去通知周围的出租车.这 ...
- c/c++ 多线程 多个线程等待同一个线程的一次性事件
多线程 多个线程等待一个线程的一次性事件 背景:从多个线程访问同一个std::future,也就是多个线程都在等待同一个线程的结果,这时怎么处理. 办法:由于std::future只能被调用一次get ...
- c/c++ 多线程 一个线程等待某种事件发生
多线程 一个线程等待某种事件发生 背景:某个线程在能够完成其任务之前可能需要等待另一个线程完成其任务. 例如:坐夜间列车,为了能够不坐过站, 1,整夜保持清醒,但是这样你就会非常累,不能够睡觉. 2, ...
- 刀哥多线程之一次性代码gcd-11-once
一次性执行 有的时候,在程序开发中,有些代码只想从程序启动就只执行一次,典型的应用场景就是"单例" // MARK: 一次性执行 - (void)once { static dis ...
- 多线程(五)多线程同步_Event事件
事件和互斥体同样属于内核同步对象,它和互斥体以及临界区在功能上有以下区别 前面的互斥体和临界区主要作用在于确保控制多个线程之间对共享资源访问,保证共享资源的完整性 事件主要作用是通知其它线程一个操作己 ...
- jQuery---jQ动画(普通,滑动,淡入淡出,自定义动画,停止动画),jQuery的事件,jQ事件的绑定/解绑,一次性事件,事件委托,事件冒泡,文档加载
jQuery---jQ动画(普通,滑动,淡入淡出,自定义动画,停止动画),jQuery的事件,jQ事件的绑定/解绑,一次性事件,事件委托,事件冒泡,文档加载 一丶jQuery动画 show,hide, ...
- opencv学习之等待按键事件-waitKey函数
文章来源: https://mangoroom.cn/opencv/opencv-learning-waitKey.html 序 waitKey函数属于opencv函数里既常用又非常基础的函数,无论是 ...
随机推荐
- javascript 使用小技巧总结
按位取反 ~a 即:返回 -(a+1),会去掉小数点. let a = 3.14; let b = ~a; //b = -(3.14+1) 取整 为-4: let c = ~b; //c = -(-4 ...
- Spring Data Jpa接口简介
Repository接口 public interface Repository<T, ID> {....} 提供了按方法名称的查询方式: 提供了@Query的查询方式 可能遇到的错误: ...
- 命令行分析组件IKende.CLI
IKende.CLI是一款开源的命令行分解组件,它可以简地把命令行字符转换成命令对象.在编写CLI应用的时候经常要对命令字符进行繁锁的分解和转换工作,而IKende.CLI的存也是为了解决以上问题而产 ...
- Java序列化和反序列化,你该知道得更多
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新 ...
- 【转载】asp.net core 2.0的认证和授权
在asp.net core中,微软提供了基于认证(Authentication)和授权(Authorization)的方式,来实现权限管理的,本篇博文,介绍基于固定角色的权限管理和自定义角色权限管理, ...
- OCR识别
最近作者项目中用到了身份证识别跟营业执照的OCR识别,就研究了一下百度云跟腾讯云的OCR产品接口. 1.腾讯云OCR 收费:身份证OCR和营业执照OCR接口,每个接口每个月各有1000次的免费调用 接 ...
- kubernetes的安装方法
背景 自己学习k8s集群,无奈屌丝一枚,没钱配置vpn服务,安装k8s花费的时间太久了.为了小伙伴们可以快速安装k8s,我花了点时间整理了这篇博客,提供一个不用FQ就可以愉快安装k8s集群的方法. 主 ...
- 1.Docker简介【Docker每天5分钟】
Docker给PaaS世界带来的“降维打击”,其实是提供了一种非常便利的打包机制.该机制打包了应用运行所需要的整个操作系统,从而保证了本地环境和云端环境的高度一致,避免了用户通过“试错”来匹配不同运行 ...
- 关于利用maven搭建ssm的博客,我们一起来探讨下问的最多的问题
前言 开心一刻 有个同学去非洲援建,刚到工地接待他的施工员是个黑人,他就用英语跟人家交流,黑人没做声. 然后他又用法语,黑人还是没说话. 然后他用手去比划.黑人终于开口了:瞎比划嘎哈,整个工地都中国人 ...
- 服务器SSH连接时间设置
用SSH客户端连接linux服务器时,经常会出现与服务器会话连接中断现象,造成这个问题的原因便是SSH服务有自己独特的会话连接机制. 解决方案: 1.设置服务器向SSH客户端连接会话发送频率和时间 v ...