C++11中std::async的使用
C++11中的std::async是个模板函数。std::async异步调用函数,在某个时候以Args作为参数(可变长参数)调用Fn,无需等待Fn执行完成就可返回,返回结果是个std::future对象。Fn返回的值可通过std::future对象的get成员函数获取。一旦完成Fn的执行,共享状态将包含Fn返回的值并ready。
std::async有两个版本:
1.无需显示指定启动策略,自动选择,因此启动策略是不确定的,可能是std::launch::async,也可能是std::launch::deferred,或者是两者的任意组合,取决于它们的系统和特定库实现。
2.允许调用者选择特定的启动策略。
std::async的启动策略类型是个枚举类enum class launch,包括:
1. std::launch::async:异步,启动一个新的线程调用Fn,该函数由新线程异步调用,并且将其返回值与共享状态的访问点同步。
2. std::launch::deferred:延迟,在访问共享状态时该函数才被调用。对Fn的调用将推迟到返回的std::future的共享状态被访问时(使用std::future的wait或get函数)。
参数Fn:可以为函数指针、成员指针、任何类型的可移动构造的函数对象(即类定义了operator()的对象)。Fn的返回值或异常存储在共享状态中以供异步的std::future对象检索。
参数Args:传递给Fn调用的参数,它们的类型应是可移动构造的。
返回值:当Fn执行结束时,共享状态的std::future对象准备就绪。std::future的成员函数get检索的值是Fn返回的值。当启动策略采用std::launch::async时,即使从不访问其共享状态,返回的std::future也会链接到被创建线程的末尾。在这种情况下,std::future的析构函数与Fn的返回同步。
std::future介绍参考:https://blog.csdn.net/fengbingchun/article/details/104115489
详细用法见下面的测试代码,下面是从其他文章中copy的测试代码,部分作了调整,详细内容介绍可以参考对应的reference:
#include "future.hpp"
#include <iostream>
#include <future>
#include <chrono>
#include <utility>
#include <thread>
#include <functional>
#include <memory>
#include <exception>
#include <numeric>
#include <vector>
#include <cmath>
#include <string>
#include <mutex>namespace future_ {///
// reference: http://www.cplusplus.com/reference/future/async/
int test_async_1()
{auto is_prime = [](int x) {std::cout << "Calculating. Please, wait...\n";for (int i = 2; i < x; ++i) if (x%i == 0) return false;return true;};// call is_prime(313222313) asynchronously:std::future<bool> fut = std::async(is_prime, 313222313);std::cout << "Checking whether 313222313 is prime.\n";// ...bool ret = fut.get(); // waits for is_prime to returnif (ret) std::cout << "It is prime!\n";else std::cout << "It is not prime.\n";return 0;
}///
// reference: http://www.cplusplus.com/reference/future/launch/
int test_async_2()
{auto print_ten = [](char c, int ms) {for (int i = 0; i < 10; ++i) {std::this_thread::sleep_for(std::chrono::milliseconds(ms));std::cout << c;}};std::cout << "with launch::async:\n";std::future<void> foo = std::async(std::launch::async, print_ten, '*', 100);std::future<void> bar = std::async(std::launch::async, print_ten, '@', 200);// async "get" (wait for foo and bar to be ready):foo.get(); // 注:注释掉此句,也会输出'*'bar.get();std::cout << "\n\n";std::cout << "with launch::deferred:\n";foo = std::async(std::launch::deferred, print_ten, '*', 100);bar = std::async(std::launch::deferred, print_ten, '@', 200);// deferred "get" (perform the actual calls):foo.get(); // 注:注释掉此句,则不会输出'**********'bar.get();std::cout << '\n';return 0;
}///
// reference: https://en.cppreference.com/w/cpp/thread/async
std::mutex m;struct X {void foo(int i, const std::string& str) {std::lock_guard<std::mutex> lk(m);std::cout << str << ' ' << i << '\n';}void bar(const std::string& str) {std::lock_guard<std::mutex> lk(m);std::cout << str << '\n';}int operator()(int i) {std::lock_guard<std::mutex> lk(m);std::cout << i << '\n';return i + 10;}
};template <typename RandomIt>
int parallel_sum(RandomIt beg, RandomIt end)
{auto len = end - beg;if (len < 1000)return std::accumulate(beg, end, 0);RandomIt mid = beg + len / 2;auto handle = std::async(std::launch::async, parallel_sum<RandomIt>, mid, end);int sum = parallel_sum(beg, mid);return sum + handle.get();
}int test_async_3()
{std::vector<int> v(10000, 1);std::cout << "The sum is " << parallel_sum(v.begin(), v.end()) << '\n';X x;// Calls (&x)->foo(42, "Hello") with default policy:// may print "Hello 42" concurrently or defer executionauto a1 = std::async(&X::foo, &x, 42, "Hello");// Calls x.bar("world!") with deferred policy// prints "world!" when a2.get() or a2.wait() is calledauto a2 = std::async(std::launch::deferred, &X::bar, x, "world!");// Calls X()(43); with async policy// prints "43" concurrentlyauto a3 = std::async(std::launch::async, X(), 43);a2.wait(); // prints "world!"std::cout << a3.get() << '\n'; // prints "53"return 0;
} // if a1 is not done at this point, destructor of a1 prints "Hello 42" here///
// reference: https://thispointer.com/c11-multithreading-part-9-stdasync-tutorial-example/
int test_async_4()
{using namespace std::chrono;auto fetchDataFromDB = [](std::string recvdData) {// Make sure that function takes 5 seconds to completestd::this_thread::sleep_for(seconds(5));//Do stuff like creating DB Connection and fetching Datareturn "DB_" + recvdData;};auto fetchDataFromFile = [](std::string recvdData) {// Make sure that function takes 5 seconds to completestd::this_thread::sleep_for(seconds(5));//Do stuff like fetching Data Filereturn "File_" + recvdData;};// Get Start Timesystem_clock::time_point start = system_clock::now();std::future<std::string> resultFromDB = std::async(std::launch::async, fetchDataFromDB, "Data");//Fetch Data from Filestd::string fileData = fetchDataFromFile("Data");//Fetch Data from DB// Will block till data is available in future<std::string> object.std::string dbData = resultFromDB.get();// Get End Timeauto end = system_clock::now();auto diff = duration_cast <std::chrono::seconds> (end - start).count();std::cout << "Total Time Taken = " << diff << " Seconds" << std::endl;//Combine The Datastd::string data = dbData + " :: " + fileData;//Printing the combined Datastd::cout << "Data = " << data << std::endl;return 0;
}} // namespace future_
GitHub:https://github.com/fengbingchun/Messy_Test
相关文章:
BAT数据披露:缺人!110万AI人才缺口,两者矛盾,凉凉了!
人工智能到底有多火?近日国内首份《BAT人工智能领域人才发展报告》新鲜出炉,此次报告是针对国内人工智能领域的人才争夺情况进行了梳理。并把研究对象锁定在BAT三大巨头的身上。来源:《BAT人工智能领域人才发展报告》其中得出最为核心的结论&…

swift3.0最新拨打电话方法
let alertVC : UIAlertController UIAlertController.init(title: "是否拨打报警电话:10086", message: "", preferredStyle: .alert) let falseAA : UIAlertAction UIAlertAction.init(title: "取消", style: .cancel, handler: nil) let tr…

关于手机已处理里重复单据的处理办法
更新视图 VWFE_TASK去掉 union TWFE_TASK_BAK 的部分,原因是因为后面做了流程预演导致的问题转载于:https://blog.51cto.com/iderun/1602828

swiftswift3.0自己封装的快速构建页面的方法
//#param mark 控件 func creatLabel(frame:CGRect,text:String,textColor:UIColor,textFont:CGFloat,textAlignment:NSTextAlignment) -> UILabel { let label UILabel.init(frame: frame) label.text text label.textColor textColor label.font UIFont.systemFont(of…
Google是如何做Code Review的?| CSDN原力计划
作者 | 帅昕 xindoo 编辑 | 屠敏出品 | CSDN 博客我和几个小伙伴一起翻译了Google前一段时间放出来的Google’s Engineering Practices documentation(https://github.com/google/eng-practices),翻译后的GitHub仓库:https://gith…

从FFmpeg 4. 2源码中提取dshow mjpeg code步骤
之前在https://blog.csdn.net/fengbingchun/article/details/103735560 中介绍过在Windows上通过vs2017编译FFmpeg源码进行单步调试的步骤,为了进一步熟悉FFmpeg这里以提取FFmpeg dshow mjpeg源码为例介绍其实现过程及注意事项: FFmpeg是用C实现的&…

ControlButton按钮事件
#ifndef __HControlButton_H__#define __HControlButton_H__#include "cocos2d.h"#include "cocos-ext.h"USING_NS_CC;USING_NS_CC_EXT; //用于标识当前按钮的状态typedef enum{ touch_begin, touch_down, touch_up,}tagForTouch;class HControlB…

swift3.0UIAlertController使用方法
let alertVC : UIAlertController UIAlertController.init(title: "添加照片", message: "", preferredStyle: .actionSheet) let cleanAction UIAlertAction(title: "取消", style: UIAlertActionStyle.cancel,handler:nil) let photoActi…

Doxygen使用介绍
Doxygen的主页为http://doxygen.nl/,它的license为GPL,最新发布版本为1.8.17,源代码存放在https://github.com/doxygen/doxygen,它支持的语言包括C、C、Objective-C、C#、Java、Python等,它支持的系统平台包括Winodws、…
云计算软件生态圈:摸到一把大牌
作者 | 老姜编辑 | 阿秃出品 | CSDN云计算(ID:CSDNcloud)“我觉得我摸着了一把大牌。”软件领域的新锐企业——有赞公司创始人兼CEO白鸦在转向SaaS领域的一个细分市场时,曾对天使投资人这样说。而老牌软件企业金蝶创始人徐少春在2…

iOS封装HTTPS双向和单向验证
1.HttpsUtil (1) 对双向和单向验证的封装 #import <Foundation/Foundation.h> #import "AFNetworking.h" interface HttpsUtil : NSObject // 双向认证 (void)configHTTPSessionManager:(AFHTTPSessionManager *)manager serverCers:(NSArray *) serverCerNam…

开源库BearSSL介绍及使用
BearSSL是用C语言实现的SSL/TLS协议,它的源码可直接通过git clone https://www.bearssl.org/git/BearSSL 下载,它的license是MIT,最新版本为0.6。 BearSSL的主要特性是: (1). 正确且安全:对不安全的协议版本和算法选…
个推CTO安森:我所理解的数据中台
作者 | 个推CTO安森来源 | 个推技术学院(ID:ID: getuitech)引言在前面两篇文章(《数据智能时代来临:本质及技术体系要求》和《多维度分析系统的选型方法》)之中,我们概括性地阐述了对于数据智能的理解&…

玩弹珠手游-杂想
前言 为什么会写这个杂想呢? 因为最近这一个月来,我有点太沉迷怪物弹珠这个游戏了,每天下班回来的时间和上下班路途都在玩这个游戏,占据了我大部分的业余时间,也该是时候放一放玩游戏了。 为什么会玩这个游戏呢&#x…

OC封装时间选择器
#import <UIKit/UIKit.h> protocol TimeDatePickerViewDelegate <NSObject> //必须实现的两个协议 required - (void)changeTime : (NSDate *)date;//当时改变时出发 - (void)daterMine : (NSDate *)date;//更确定时间 end interface TimeDatePickerView :UIView /…
银行卡大小的充电宝,买就送耳机!
每个人的朋友圈和微博上似乎都有那么几个活得让人羡慕的朋友他们的生活看起来不仅精致,还很丰富多彩从早上第一刻就开始了↓出门旅游新一天的穿搭逆天朋友团咖啡馆到书店逼格十足的日料夜景太迷人忍不住发个小视频最后一定不要错过傍晚的夕阳,真的好上镜…

C++中插件使用举例
插件并不是在构建时链接的,而是在运行时发现并加载的。因此,用户可以利用你定义好的插件API来编写自己的插件。这样他们就能以指定方式扩展API的功能。插件库是一个动态库,它可以独立于核心API编译,在运行时根据需要显示加载。不过…

C和C++安全编码笔记:指针诡计
指针诡计(pointer subterfuge)是通过修改指针值来利用程序漏洞的方法的统称。 可以通过覆盖函数指针将程序的控制权转移到攻击者提供的外壳代码(shellcode)。当程序通过函数指针执行一个函数调用时,攻击者提供的代码将会取代原本希望执行的代码而得到执行。 对象指…
runLoop和runtime的分析
一.RunLoop: Runloop是事件接收和分发机制的一个实现。 Runloop提供了一种异步执行代码的机制,不能并行执行任务。 在主队列中,Main RunLoop直接配合任务的执行,负责处理UI事件、定时器以及其他内核相关事件。 (1).RunLoop的主要目的&#…
脑出血遇到深度学习,是否可以无所遁形?
近期大家对身体健康这个话题格外关注,而我们今天公开课的主题也恰巧与此不谋而合。我国脑卒的发病率已经超过心血管疾病,成为致死、致残率最高的疾病,并且发病率呈逐年上升的趋势,此外脑血管病和颅内肿瘤等脑部疾病也危害人们的健…

Cloudera Manager 5.3 和 CDH5.3.0 本地(离线)
为什么80%的码农都做不了架构师?>>> 声明一下:http://my.oschina.net/dataRunner/blog/369129 是本人所写,并非抄袭。 有部分内容来自 http://www.wangyongkui.com/hadoop-cdh5/ 这个文件是根据官网操作,翻译的不…
万字长文详解如何用Python玩转OpenGL | CSDN 博文精选
作者 | 天元浪子来源 | CSDN博文精选【编者按】OpenGL(开放式图形库),用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口,C、C、Python、Java等语言都能支持 OpenGL。本文作者以 Python 语法为例,用两万字详…

模仿视频抓帧实现
路口或某些场所可能并不会把从摄像头获取到的视频全部存储下来或对所有的视频帧进行处理,即摄像设备是一直处于打开状态,可能会根据需要间隔性的抓取其中一帧,或当某事件触发时才会抓取当前的一帧数据进行处理。这里使用两个线程来模仿此场景…

iOS--MD5加密封装
#import <Foundation/Foundation.h> interface MD5 : NSObject /** * md5加密 * * param inPutText 需要加密的字符串 * * return 加密好的字符串 */ (NSString *)md5:(NSString *)inPutText; end #import "MD5.h" #import "CommonCrypto/CommonDiges…

Akka路由_RoundRobinRoutingLogic
2019独角兽企业重金招聘Python工程师标准>>> Akka路由_RoundRobinRoutingLogic 使用Round Robin算法的Router,代码中有注释,基本和上篇文章中的代码一样 http://my.oschina.net/xinxingegeya/blog/369721, 具体如下,关…

iOS ---网络请求封装(自动缓存与手动缓存)
#import <Foundation/Foundation.h> interface WNetworkCache : NSObject /** * 手动写入/更新缓存 * * param jsonResponse 要写入的数据 * param URL 请求URL * * return 是否写入成功 */ (BOOL)saveJsonResponseToCacheFile:(id)jsonResponse andURL:(NSStrin…

Windows下获取视频设备的一种改进实现
之前在https://blog.csdn.net/fengbingchun/article/details/102806822中介绍过在Windows下获取视频设备列表的方法。其实那种实现方法是有缺陷的,当PC机上连接多个视频设备,并且其中有设备处于启动运行状态时,再调用相关接口获取视频设备可能…
最新单步目标检测框架,引入双向网络,精度和速度均达到不错效果
作者 | Tiancai Wang等译者 | 路一直都在出品 | AI科技大本营(ID:rgznai100)one-stage的目标检测方法因其具有实时性强、检测精度高等特点,近年来受到广泛关注。目标检测包括分类和定位两个子任务,通常来说,one-stage目…

基于Sentinel的Redis3.2高可用方案
默认情况下,Redis node和sentinel的protected-mode都是yes,在搭建集群时,若想从远程连接redis集群,需要将redis.conf和sentinel.conf的protected-mode修改为no,若只修改redis node,从远程连接sentinel后&am…