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事件
事件和互斥体同样属于内核同步对象,它和互斥体以及临界区在功能上有以下区别 前面的互斥体和临界区主要作用在于确保控制多个线程之间对共享资源访问,保证共享资源的完整性 事件主要作用是通知其它线程一个操作己 ...
随机推荐
- 小伙子,你真的搞懂 transient 关键字了吗?
先解释下什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术. Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将 ...
- Python、pip和scrapy的安装——Python爬虫学习笔记1
Python作为爬虫语言非常受欢迎,近期项目需要,很是学习了一番Python,在此记录学习过程:首先因为是初学,而且当时要求很快速的出demo,所以首先想到的是框架,一番查找选用了Python界大名鼎 ...
- BBS论坛(六)
6.1.优化json数据的返回 (1)新建utils/restful.py # utils/restful.py from flask import jsonify class HttpCode(ob ...
- 使用ML.NET实现猜动画片台词
前面几篇主要内容出自微软官方,经我特意修改的案例的文章: 使用ML.NET实现情感分析[新手篇] 使用ML.NET预测纽约出租车费 .NET Core玩转机器学习 使用ML.NET实现情感分析[新手篇 ...
- uWSGI 踩坑记
一.协议的一致性 uWSGI 是在 nginx 后面,所以 nginx 转发请求时的协议要和 uWSGI 监听的协议一致.否则就会出现问题,因为是三者之间的通信,排查起来需要想清楚请求传递的次序: N ...
- 【Python3爬虫】下载酷狗音乐上的歌曲
经过测试,可以下载要付费下载的歌曲(n_n) 准备工作:Python3.5+Pycharm 使用到的库:requests,re,json,time,fakeuseragent 步骤: 打开酷狗音乐的官 ...
- PC逆向之代码还原技术,第一讲基本数据类型在内存中的表现形式.浮点,指针寻址公式
目录 代码还原技术 一丶简介代码还原 二丶代码还原中的数据类型表现形式 1.整数类型 2.无符号整数 3.有符号整数 4.浮点数数据类型 5.浮点编码 4.Double类型解析. 三丶浮点汇编 1.浮 ...
- Tapestry3.0开发概论
一.TAPESTRY技术的综述. tapestry是平行于struts/Spring MVC/webwork /jsf等开发工具的语言.tapestry是基于组件的开发工具.它具有组件的可重用性.因为 ...
- Oracle闪回表
Oracle闪回技术 场景:测试环境数据库的表数据被误删除. 解决思路:使用闪回表技术 原理 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小 ...
- angularjs1.X进阶笔记(3)——如何重构controller
目录 一. 结构拆分 二.基本代码优化 本篇是内部培训交流会的摘要总结. 培训PPT和示例代码已托管至我的github仓库: https://github.com/dashnowords/blogs/ ...