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函数里既常用又非常基础的函数,无论是 ...
随机推荐
- php 168任意代码执行漏洞之php的Complex (curly) syntax
今天了解了php 168的任意代码执行漏洞,Poc: http://192.168.6.128/pentest/cms/php168/member/post.php?only=1&showHt ...
- springBoot(12)---整合Swagger2
Spingboot整合Swagger2 随着互联网技术的发展,一般开发都是前后端分离,那么前端和后端的唯一联系,变成了API接口:API文档变成了前后端开发人员联系的纽带,变得越来越重要,没有API ...
- C#计算一段代码的运行时间
第一种方法利用System.DateTime.Now: static void SubTest() { DateTime beforDT = System.DateTime.Now; //耗时巨大的代 ...
- asp.net core 系列 17 通用主机 IHostBuilder
一.概述 ASP.NET Core 通用主机 (HostBuilder),该主机对于托管不处理 HTTP 请求的应用非常有用.通用主机的目标是将 HTTP 管道从 Web 主机 API 中分离出来,从 ...
- 使用mpvue开发小程序教程(五)
在上一章节中,我们了解了组件的三个基本特性以及组件的基本使用方法.在实际的小程序开发中,我们应该以组件的思维去设计每个小程序的功能页面,对其进行合理的组件拆分,让每个部分都保持功能简洁.条理清楚.各司 ...
- 使用MQ来保证分布式事务的最终一致性
前言 之前我们讨论了如何拆分一个订单下单的一个服务(https://www.cnblogs.com/linkstar/p/9610268.html) 从单体到微服务的拆分,当时我们只是对原来的整个服务 ...
- Chapter 5 Blood Type——8
He chuckled. "What are your plans?" 他窃笑道.“那你的计划是什么?” I blushed. I had been vacillating dur ...
- 系列文章|OKR与敏捷(一):瀑布式目标与敏捷的冲突
OKR与敏捷开发的原理有着相似之处,但已经使用敏捷的团队再用OKR感觉会显得多余.这种误解的根源就在于对这两种模式不够了解,运用得当的情况下,OKR和敏捷可以形成强强联合的效果,他们可以创造出以价值为 ...
- Spring Boot 路由
多路由指向同一个方法 @GetMapping(value = {"/login","/index"}) 访问http://127.0.0.1/index 和 h ...
- [ Java面试题 ]框架篇二
1.Hibernate工作原理及为什么要使用Hibernate? 工作原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Tr ...