1、std::async函数原型:

template<class Fn, class... Args>
future<typename result_of<Fn(Args...)>::type> async(launch policy, Fn&& fn, Args&&...args);

功能:第二个参数接收一个可调用对象(仿函数、lambda表达式、类成员函数、普通函数......)作为参数,并且异步或是同步执行他们。

a、对于是异步执行还是同步执行,由第一个参数的执行策略决定:

(1)、std::launch::async 传递的可调用对象异步执行;

(2)、std::launch::deferred 传递的可调用对象同步执行;

(3)、std::launch::async | std::launch::deferred 可以异步或是同步,取决于操作系统,我们无法控制;

(4)、如果我们不指定策略,则相当于(3)。

b、对于执行结果:

我们可以使用get、wait、wait_for、wait_until等待执行结束,区别是get可以获得执行的结果。如果选择异步执行策略,调用get时,如果异步执行没有结束,get会阻塞当前调用线程,直到异步执行结束并获得结果,如果异步执行已经结束,不等待获取执行结果;如果选择同步执行策略,只有当调用get函数时,同步调用才真正执行,这也被称为函数调用被延迟。

c、返回结果std::future的状态:

(1)、deffered:异步操作还没有开始;

(2)、ready:异步操作已经完成;

(3)、timeout:异步操作超时。

实例1(异步执行和同步执行):

// STLasync.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include "pch.h"
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <future>using namespace std::chrono;std::string fetchDataFromDB(std::string recvData) {std::cout << "fetchDataFromDB start" << std::this_thread::get_id() << std::endl;std::this_thread::sleep_for(seconds(5));return "DB_" + recvData;
}std::string fetchDataFromFile(std::string recvData) {std::cout << "fetchDataFromFile start" << std::this_thread::get_id() << std::endl;std::this_thread::sleep_for(seconds(3));return "File_" + recvData;
}int main() {std::cout << "main start" << std::this_thread::get_id() << std::endl;//获取开始时间system_clock::time_point start = system_clock::now();std::future<std::string> resultFromDB = std::async(std::launch::async, fetchDataFromDB, "Data");//从文件获取数据std::future<std::string> fileData = std::async(std::launch::deferred, fetchDataFromFile, "Data");//直到调用get函数fetchDataFromFile才开始执行std::string FileData = fileData.get();//如果fetchDataFromDB()执行没有完成,get会一直阻塞当前线程std::string dbData = resultFromDB.get();//获取结束时间auto end = system_clock::now();auto diff = duration_cast<std::chrono::seconds>(end - start).count();std::cout << "Total Time taken= " << diff << "Seconds" << std::endl;//组装数据std::string data = dbData + " :: " + FileData;//输出组装的数据std::cout << "Data = " << data << std::endl;return 0;
}

实例2(查询future的状态获取异步执行的结果):

// STLasync.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include "pch.h"
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <future>using namespace std::chrono;std::string fetchDataFromDB(std::string recvData) {std::cout << "fetchDataFromDB start" << std::this_thread::get_id() << std::endl;std::this_thread::sleep_for(seconds(5));return "DB_" + recvData;
}int main() {std::cout << "main start" << std::this_thread::get_id() << std::endl;//获取开始时间system_clock::time_point start = system_clock::now();std::future<std::string> resultFromDB = std::async(std::launch::async, fetchDataFromDB, "Data");std::future_status status;std::string dbData;do{status = resultFromDB.wait_for(std::chrono::seconds(1));switch (status){case std::future_status::ready:std::cout << "Ready..." << std::endl;//获取结果dbData = resultFromDB.get();std::cout << dbData << std::endl;break;case std::future_status::timeout:std::cout << "timeout..." << std::endl;break;case std::future_status::deferred:std::cout << "deferred..." << std::endl;break;default:break;}} while (status != std::future_status::ready);//获取结束时间auto end = system_clock::now();auto diff = duration_cast<std::chrono::seconds>(end - start).count();std::cout << "Total Time taken= " << diff << "Seconds" << std::endl;return 0;
}

输出:

main start9096

fetchDataFromDB start7980

timeout...

timeout...

timeout...

timeout...

Ready...

DB_Data

Total Time taken= 5Seconds

std::async()详解相关推荐

  1. C++11 并发指南三(std::mutex 详解)

    上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex ...

  2. 【转】C++11 并发指南五(std::condition_variable 详解)

    http://www.cnblogs.com/haippy/p/3252041.html 前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三 ...

  3. C++11 并发指南五(std::condition_variable 详解)

    前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...

  4. C++11 并发指南------std::thread 详解

    参考: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Int ...

  5. Node.js中Async详解

    Node.js中Async详解:流程控制 安装 npm install async --save 地址 https://github.com/caolan/async Async的内容主要分为三部分 ...

  6. c++ std::move详解

    c++ std::move详解 在移动构造中的时候,移动拷贝其实就是把原来参数对象的指针地址给到了构造的对象,再把原先对象的指针置为NULL,这样内存就不会被原来函数给析构了.对于实体的对象执行的其实 ...

  7. std::tie详解

    std::tie:创建左值引用的 tuple,或将 tuple 解包为独立对象 返回值 含左值引用的 std::tuple 对象. 注意 std::tie 可用于解包 std::pair ,因为 st ...

  8. 【c++】24.std::function和std::bind详解

    1. 可调用对象 查看全文 http://www.taodudu.cc/news/show-494578.html 相关文章: [c++]26.浅谈"事件驱动".select.po ...

  9. std::bind 详解及参数解析

    // Bind_std_function.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...

最新文章

  1. 【C语言】学习笔记3——字符串
  2. Mysql之group by 和order by 一起用时的排序问题(亲测)
  3. 第一章初始mybatis框架
  4. FLASH CS3中的FLA形式组件制作教程
  5. leetcode 558. Logical OR of Two Binary Grids Represented as Quad-Trees | 558. 四叉树交集(分治法)
  6. day21 面向对象之继承和组合
  7. IT人的素质 设计杂谈
  8. 服务器宝塔怎么开启php5.4伪静态,WeCenter在宝塔面板LNMP环境下开启伪静态方法
  9. java socket保活_gb28181简单实现sip信令服务器(java版基于springboot):四、sip摄像头心跳保活、推流(tcp/udp)和结束推流...
  10. 磁盘碎片对计算机系统的影响,磁盘碎片整理第9遍了|Win7磁盘碎片整理的方法
  11. 5G核心网技术基础自学系列 | 与EPC互通
  12. r340服务器怎么接显示器,笔记本电脑如何连显示器_笔记本怎么链接显示器
  13. Response to preflight request do‘nt access control check: Redirect is not allow for a preflight re.
  14. 只转不评:112家IT公司薪水一览表
  15. 福布斯发布2013中国潜力上市公司100强(表)
  16. idea 配置web项目图片无法显示问题
  17. 批归一化作用_批归一化(Batch Normalization)
  18. 关于微信小程序云开发以及云开发实例展示
  19. 【VitePress】项目打包异常问题总结(Could not resolve、Unexpected character ‘‘、Invalid value used as weak map key)
  20. 全球网络设备供应排名 华为公司稳坐第一名

热门文章

  1. 数字心电图仪综合系统设计与实现verilog
  2. matlab括号区别,matlab中各种括号(),[],与{}的区别与认识
  3. python字符串可以保存在变量中吗_在python中可以从字符串变量实例化类吗?
  4. 基于jsp的教师科研工作量_javaweb教师工作量管理系统
  5. linux如何移动数据到文件系统,怎么把数据文件从文件系统移动到asm?
  6. 需求获取安排计划书_6分钟教你写一份融资计划书
  7. XSS介绍_靶场DVWA,pikachu;其他XSS平台
  8. 生成word_Word生成员工信息表,每一页生成独立文件,还能自动命名
  9. 致我测试之路的“七年之痒”
  10. mysql 测试与mongodb 测试对比