• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
轻量级多级菜单控制框架程序(C语言)发布时间:2022-07-18
下一篇:
密码学那些事———SHA-512及其C++实现发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap