std::async()详解
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()详解相关推荐
- C++11 并发指南三(std::mutex 详解)
上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex ...
- 【转】C++11 并发指南五(std::condition_variable 详解)
http://www.cnblogs.com/haippy/p/3252041.html 前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三 ...
- C++11 并发指南五(std::condition_variable 详解)
前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...
- C++11 并发指南------std::thread 详解
参考: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Int ...
- Node.js中Async详解
Node.js中Async详解:流程控制 安装 npm install async --save 地址 https://github.com/caolan/async Async的内容主要分为三部分 ...
- c++ std::move详解
c++ std::move详解 在移动构造中的时候,移动拷贝其实就是把原来参数对象的指针地址给到了构造的对象,再把原先对象的指针置为NULL,这样内存就不会被原来函数给析构了.对于实体的对象执行的其实 ...
- std::tie详解
std::tie:创建左值引用的 tuple,或将 tuple 解包为独立对象 返回值 含左值引用的 std::tuple 对象. 注意 std::tie 可用于解包 std::pair ,因为 st ...
- 【c++】24.std::function和std::bind详解
1. 可调用对象 查看全文 http://www.taodudu.cc/news/show-494578.html 相关文章: [c++]26.浅谈"事件驱动".select.po ...
- std::bind 详解及参数解析
// Bind_std_function.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...
最新文章
- 【C语言】学习笔记3——字符串
- Mysql之group by 和order by 一起用时的排序问题(亲测)
- 第一章初始mybatis框架
- FLASH CS3中的FLA形式组件制作教程
- leetcode 558. Logical OR of Two Binary Grids Represented as Quad-Trees | 558. 四叉树交集(分治法)
- day21 面向对象之继承和组合
- IT人的素质 设计杂谈
- 服务器宝塔怎么开启php5.4伪静态,WeCenter在宝塔面板LNMP环境下开启伪静态方法
- java socket保活_gb28181简单实现sip信令服务器(java版基于springboot):四、sip摄像头心跳保活、推流(tcp/udp)和结束推流...
- 磁盘碎片对计算机系统的影响,磁盘碎片整理第9遍了|Win7磁盘碎片整理的方法
- 5G核心网技术基础自学系列 | 与EPC互通
- r340服务器怎么接显示器,笔记本电脑如何连显示器_笔记本怎么链接显示器
- Response to preflight request do‘nt access control check: Redirect is not allow for a preflight re.
- 只转不评:112家IT公司薪水一览表
- 福布斯发布2013中国潜力上市公司100强(表)
- idea 配置web项目图片无法显示问题
- 批归一化作用_批归一化(Batch Normalization)
- 关于微信小程序云开发以及云开发实例展示
- 【VitePress】项目打包异常问题总结(Could not resolve、Unexpected character ‘‘、Invalid value used as weak map key)
- 全球网络设备供应排名 华为公司稳坐第一名
热门文章
- 数字心电图仪综合系统设计与实现verilog
- matlab括号区别,matlab中各种括号(),[],与{}的区别与认识
- python字符串可以保存在变量中吗_在python中可以从字符串变量实例化类吗?
- 基于jsp的教师科研工作量_javaweb教师工作量管理系统
- linux如何移动数据到文件系统,怎么把数据文件从文件系统移动到asm?
- 需求获取安排计划书_6分钟教你写一份融资计划书
- XSS介绍_靶场DVWA,pikachu;其他XSS平台
- 生成word_Word生成员工信息表,每一页生成独立文件,还能自动命名
- 致我测试之路的“七年之痒”
- mysql 测试与mongodb 测试对比