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函数里既常用又非常基础的函数,无论是 ...
随机推荐
- CentOS Ubantu linux中实用系统相关常用命令
系统信息相关命令 本节内容主要是为了方便通过远程终端维护服务器时,查看服务器上当前 系统日期和时间 / 磁盘空间占用情况 / 程序执行情况 本小结学习的终端命令基本都是查询命令,通过这些命令对系统资源 ...
- 11.Git分支-远程跟踪分支的概念、多个远程仓库的使用
1.远程跟踪分支的概念 远程引用是对远程仓库的引用,包括分支.标签等等. 1.可以通过 git ls-remote <remote> 来获得远程引用的完整列表 2.git remote ...
- rabbitMQ linux安装
1,下载 erlang (http://www.rabbitmq.com/releases/erlang/) wget http://www.rabbitmq.com/releases/erlang/ ...
- 从零开始学习PYTHON3讲义(四)让程序更友好
<从零开始PYTHON3>第四讲 先看看上一讲的练习答案. 程序完成的是功能,功能来自于"程序需求"("需求"这个词忘记了什么意思的去复习一下第二讲 ...
- 从锅炉工到AI专家(2)
大数据 上一节说到,大多的AI问题,会有很多个变量,这里深入的解释一下这个问题. 比如说某个网站要做用户行为分析,从而指导网站建设的改进.通常而言如果没有行为分析,并不需要采集用户太多的数据. 比如用 ...
- Linux学习笔记(一):常用命令(1)
经过统计Linux中能够识别的命令超过3000种,当然常用的命令就远远没有这么多了,按照我的习惯,我把已经学过的Linux常用命令做了以下几个方面的分割: 1.文件处理命令 2.文件搜索命令 3.帮助 ...
- mysql锁机制详解
前言 大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,但当时对mysql的锁机制只是管中窥豹,所以本文打算总结一下mysql的锁机制. 本文主要论述关于mysql锁机 ...
- C语言实现链队列的初始化&进队&出队
/*链表实现队列的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typed ...
- 为 docker 中的 nginx 配置 https
没有 https 加持的网站会逐渐地被浏览器标记为不安全的,所以为网站添加 https 已经变得刻不容缓.对于商业网站来说,花钱购买 SSL/TLS 证书并不是什么问题.但对于个人用户来说,如果能有免 ...
- Docker最全教程——从理论到实战(五)
往期内容链接 Docker最全教程——从理论到实战(一) Docker最全教程——从理论到实战(二) Docker最全教程——从理论到实战(三) Docker最全教程——从理论到实战(四) 本篇教程持 ...