当前位置: 移动技术网 > IT编程>开发语言>C/C++ > c/c++ 多线程 等待一次性事件 future概念

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

2018年11月21日  | 移动技术网IT编程  | 我要评论

家长网,廊坊新世纪幼儿园,人体盛

多线程 等待一次性事件 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;
}

编译方法:

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

运行结果:

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

知识点:

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

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

本人微信:xiaoshitou5854

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网