c/c++ 多线程 等待一次性事件 future概念
多线程 等待一次性事件 future概念
背景:有时候,一个线程只等待另一个线程一次,而且需要它等待的线程的返回值。
案例:滴滴叫车时,点完了叫车按钮后,叫车的后台线程就启动了,去通知周围的出租车。这时,用户就可以去干别的了,而且用户只等待叫车的线程一次就够了,也就是有出租车应答了,这个等待就结束了,不会去再次等待有别的出租车应答。应答后,叫车的线程会返回出租车的车牌号,出租车的位置等信息,给叫车的用户。
问题:实现上面的场景,很容易就联想到用多线程去实现,但是std::thread是没有返回值,所以无法得到某个线程的返回值。
std::future解决了这个问题。future是有返回值的,并且只等待某个线程一次。
future用法:在用户叫车时间点,调用std::async方法,启动叫车,叫车成功后,叫车线程通知用户线程,用户线程调用future对象的get()方法,得到出租车的具体信息。
future是模板类,线程方法返回值的类型,就是模板的类型。
代码:
#include <future>
#include <iostream>
#include <unistd.h>
int return_from_thread(int val){
std::cout << val << std::endl;
//sleep(1);
return val;
}
void do_something(){
std::cout << "在等滴滴来车" << std::endl;
}
int main(){
//std::future<int> ret = std::async(std::launch::deferred,return_from_thread, 10);
//std::future<int> ret = std::async(std::launch::async,return_from_thread, 10);
std::future<int> ret = std::async(return_from_thread, 10);
do_something();
//ret.wait();
std::cout << "车来了,车牌号:" << ret.get() << std::endl;
std::cout << "end" << std::endl;
}
github源代码
编译方法:
g++ -g XXX.cpp -std=c++11 -pthread
运行结果:
在等滴滴来车
车来了,车牌号:10
10
end
知识点:
- 调用get方法后,当前线程就会被阻塞,知道被等待的线程结束。
std::async第一个参数决定:是开启一个新的线程,还是不开新的线程
- std::launch::async:开启一个新的线程,执行指定的方法。
- std::launch::deferred:不开新的线程,直到在future上调用wait()或者get()方法,才会执行指定的方法。
- std::launch::deferred | std::launch::async:由系统决定是开一个新的线程还是不开。
- 不指定第一个参数的效果和std::launch::deferred | std::launch::async相同。
c/c++ 学习互助QQ群:877684253
本人微信:xiaoshitou5854
c/c++ 多线程 等待一次性事件 future概念的更多相关文章
- c/c++ 多线程 等待一次性事件 异常处理
多线程 等待一次性事件 异常处理 背景:假设某个future在等待另一个线程结束,但是在被future等待的线程里发生了异常(throw一个异常A),这时怎么处理. 结果:假设发生了上面的场景,则在调 ...
- c/c++ 多线程 等待一次性事件 std::promise用法
多线程 等待一次性事件 std::promise用法 背景:不是很明白,不知道为了解决什么业务场景,感觉std::async可以优雅的搞定一切的一次等待性事件,为什么还有个std::promise. ...
- c/c++ 多线程 等待一次性事件 packaged_task用法
多线程 等待一次性事件 packaged_task用法 背景:不是很明白,不知道为了解决什么业务场景,感觉std::asynck可以优雅的搞定一切,一次等待性事件,为什么还有个packaged_tas ...
- c/c++ 多线程 多个线程等待同一个线程的一次性事件
多线程 多个线程等待一个线程的一次性事件 背景:从多个线程访问同一个std::future,也就是多个线程都在等待同一个线程的结果,这时怎么处理. 办法:由于std::future只能被调用一次get ...
- c/c++ 多线程 一个线程等待某种事件发生
多线程 一个线程等待某种事件发生 背景:某个线程在能够完成其任务之前可能需要等待另一个线程完成其任务. 例如:坐夜间列车,为了能够不坐过站, 1,整夜保持清醒,但是这样你就会非常累,不能够睡觉. 2, ...
- java 多线程研究:锁的概念
java多线程:锁 java的多线程中的锁是干嘛的呢?在网上找了很多博客,大都是很专业的语言,让我一时间摸不着头脑.下面分三个部分来总结多线程中的锁的概念. 一,基础概念: 多线程在运行的时候可能会遇 ...
- 刀哥多线程之一次性代码gcd-11-once
一次性执行 有的时候,在程序开发中,有些代码只想从程序启动就只执行一次,典型的应用场景就是"单例" // MARK: 一次性执行 - (void)once { static dis ...
- JS的事件流概念*******
事件的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件. 事件流 事件流描述的 ...
- 多线程(五)多线程同步_Event事件
事件和互斥体同样属于内核同步对象,它和互斥体以及临界区在功能上有以下区别 前面的互斥体和临界区主要作用在于确保控制多个线程之间对共享资源访问,保证共享资源的完整性 事件主要作用是通知其它线程一个操作己 ...
随机推荐
- java 随机数产生 常用类及方法
1.Random类 Random():创建一个新的随机数生成器. new一个Random类的对象: Random r = new Random(); 利用该对象产生一个随机整数:常用nextInt,不 ...
- Linux中断程序命令
在运行 python 脚本的时候想要中断程序,发现如下情况: ctrl+c 居然无法中断程序! 这时候尝试 ctrl+d 还是毫无效果,最后尝试 ctrl+\: 查看该程序是否还在运行 ps aux ...
- Chapter 4 Invitations——28
"Oh, thanks, now that's all cleared up." Heavy sarcasm. “哦,真感谢,现在一切都清楚了.” 我很讽刺的说道 I realiz ...
- 云原生实践之 RSocket 从入门到落地:Servlet vs RSocket
技术实践的作用在于:除了用于构建业务,也是为了验证某项技术或框架是否值得大规模推广. 本期开始,我们推出<RSocket 从入门到落地>系列文章,通过实例和对比来介绍RSocket.主要围 ...
- 小程序开发笔记【一】,查询用户参与活动列表 left join on的用法
今天在做一个用户活动查询功能的时候,查询参与的活动.正常,使用egg-mysql查询数据一般会这么写 result = await this.app.mysql.select('tb_activity ...
- Nacos系列:基于Nacos的注册中心
前言 所谓注册中心,其实是分布式架构演进过程中的产物,在系统中充当一个协调者的角色.但是,为什么需要这样一个协调者的角色呢?我们先来看一个例子,以便理解为什么分布式架构中需要有注册中心. 案例 小明和 ...
- Android Studio 1.1.0 比较有用的快捷键
格式化代码:Ctrl + Alt + L清除无效包引用 Alt + Ctrl + O折叠展开代码块 Ctrl + Plus/Minus折叠展开全部代码块 Ctrl + Shift + Plus,Min ...
- 解决ASP.NET MVC 接受Request Payload参数问题
今天与跟前端小伙伴对接口,发现微信小程序的POST带参数传值HttpContent.Request[]接收不到参数. 拿小程序官网文档举例 wx.request({ url: 'Text/Text', ...
- [日常] nginx记录post数据
1.使用log_format指令来更改日志格式,该指令只能放在http{}段 log_format 日志名 '日志内容'; server { access_log /var/log/nginx/d ...
- 阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句
参考帖子:http://www.cnblogs.com/han-1034683568/p/6730869.html Druid数据连接池简介 Druid是Java语言中最好的数据库连接池.Druid能 ...