C++并发实战13:std::future、std::async、std::promise、std::packaged_task

          std::condition_variable可以用于异步事件的重复通知,但是有些时候可能只等待事件发生一次,比如:等待特定的航班,用条件变量大杀器有点浪费了。C++11标准库提供了几种异步任务机制。通常thread不能返回线程执行的结果(可以通过引用参数返回),而在异步处理当中很多时候都需要获得计算的结果。如果只获取结果一次那么选用future,即通过future获取了结果后,后续再通过此future获取结果将会出错。

(1) future,async,packaged_task,promise用法简介

         std::future可用于异步任务中获取任务结果,但是它只是获取结果而已,真正的异步调用需要配合std::async, std::promise, std::packaged_task。这里async是个模板函数,promise和packaged_task是模板类,通常模板实例化参数是任务函数(callable object)。下面是它们的部分组合用法:假设计算任务 int task(string x);

                 1  async+future简单用法

future<int> myFuture=async(task,10)  

                        //这里async自动创建一个后台线程(可以选取一个空闲的线程)执行任务task函数,并将计算结果保存在myFuture中,这里future的模板参数要和任务task返回类型一致为int。怎样获得任务结果呢?通常原来的线程(即创建myFuture的线程记为A,不是async执行task那个线程)可以执行其它操作,直到其想要获取task的结果时调用int x=myFuture.get()即可获得task的执行结果并保存至x中。注意若task没有执行完就调用了myFuture.get()那么线程A将会阻塞直到task完成。

               

               2 packaged_task+future简单用法

packaged_task<int(int)> myPackaged(task);//首先创建packaged_task对象myPackaged其内部创建一个函数task和一个共享状态(用于返回task的结果)
future<int> myFuture=myPackaged.get_future();//通过packaged_task::get_future()返回一个future对象myFuture用于获取task的任务结果
thread myThread(move(myPackaged),"hello world");//创建一个线程执行task任务,这里注意move语义强制将左值转为右值使用因为packaged_task禁止copy constructor,可以不创建线程,那么task任务的执行将和future结果的获取在同一个线程,这样就不叫异步了
//这里主线程可以做其它的操作
int x=myFuture.get();//线程还可以在执行一些其它操作,直到其想获取task的结果时调用此语句


               3 promise+future简单用法,摘自cplusplus的范例:

#include <iostream>       // std::cout
#include <functional>     // std::ref
#include <thread>         // std::thread
#include <future>         // std::promise, std::future
void print_int (std::future<int>& fut) {
  int x = fut.get();//当promise::set_value()设置了promise的共享状态值后,fut将会通过future::get()获得该共享状态值,若promise没有设置该值那么fut.get()将会阻塞线程直到共享状态值被promise设置
  std::cout << "value: " << x << '\n';//输出:value: 10
}
int main ()
{
  std::promise<int> prom;                      //创建一个promise对象
  std::future<int> fut = prom.ge
  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值