码迷,mamicode.com
首页 > 编程语言 > 详细

c/c++ 多线程 等待一次性事件 future概念

时间:2018-11-20 22:52:53      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:时间   col   ast   hit   code   g++   something   场景   clu   

多线程 等待一次性事件 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(return_from_thread, 10);
  do_something();
  std::cout << "车来了,车牌号:" << ret.get() << std::endl;
  std::cout << "end" << std::endl;
}

github源代码

编译方法:

g++ -g XXX.cpp -std=c++11 -pthread

运行结果:

在等滴滴来车
车来了,车牌号:10
10
end

知识点:

  • 调用get方法后,当前线程就会被阻塞,知道被等待的线程结束。

c/c++ 学习互助QQ群:877684253

技术分享图片

本人微信:xiaoshitou5854

c/c++ 多线程 等待一次性事件 future概念

标签:时间   col   ast   hit   code   g++   something   场景   clu   

原文地址:https://www.cnblogs.com/xiaoshiwang/p/9991883.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!