c/c++语言开发共享c/c++ 多线程 等待一次性事件 future概念

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

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

本人微信:xiaoshitou5854

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/606227.html

(0)
上一篇 2021年5月13日
下一篇 2021年5月13日

精彩推荐