当前位置: 首页 > news >正文

c++ async 使用详解,创建异步任务的多种方法

c++ async 使用详解

std::async

  • 头文件 #include <future>

  • 函数原型:

    template<class Function, class... Args>
    std::future<std::invoke_result_t<std::decay_t<Function>,std::decay_t<Args>...>>async(std::launch policy, Function&& f, Args&&... args);template<class Function, class... Args>
    std::future<std::invoke_result_t<std::decay_t<Function>,std::decay_t<Args>...>>async(Function&& f, Args&&... args);
    // 等同于以 std::launch::async | std::launch::deferred 策略调用上面的函数
    
    • policy:以何种策略调用可调用对象 f,可以为以下三种:
      • std::launch::async:以异步的方式调用 f,即必须另外开启专属的线程,在其上运行 f。
      • std::launch::deferred:在返回的 std::future 上调用了非定时等待函数,即 wait 或者 get 时,才执行 f。
      • std::launch::async | std::launch::deferred:可能异步运行 f 或者直到调用 wait 或者 get 时才运行,取决于系统的负载,无法人为控制。
    • f:要调用的可调用对象。
    • args:传递给 发的参数。
    • 返回值:std::future 对象,在其上调用 wait 可以等待 f 完成,调用 get 可以等待并获取 f 的返回值。
  • 作用:以异步或者同步的调用可调用对象 f,并可以通过返回的 std::future 对象获取 f 的返回值。

使用注意

  • 如果没有任何对象接收 std::sync 的返回值,即使指定了 std::launch::async 策略,std::future 的析构函数也会阻塞直到整个调用完成。

  • 示例如下:

    // 临时量即 std::future 的析构函数等待睡眠完成。
    std::async(std::launch::async, []{ std::this_thread::sleep_for(10ms); });
    // 在睡眠完成之前,本行代码不会得到运行
    std::async(std::launch::async, []{ printf("xx"); });
    
  • 只有从 std::async 获取的 std::future 对象其析构函数会阻塞,以其他方式获得的 std::future 对象则不会。

示例1 函数作为参数

#include <stdio.h>
#include <thread>
#include <future>
#include <chrono>int f1(int n, int& b)
{for (int i = 0; i < 3; ++i) {printf("async is running\n");++n;++b;std::this_thread::sleep_for(std::chrono::milliseconds(10));}printf("n is %d, b is %d\n", n, b);return n + b;
}int main()
{int n = 0;int b = 0;// n 按值传递,b 按引用传递auto f = std::async(std::launch::async, f1, n, std::ref(b));int ret = f.get();printf("result is %d\n", ret);return 0;
}

示例2 lamba 作为参数

#include <stdio.h>
#include <thread>
#include <future>
#include <chrono>int main()
{auto f = std::async([]() -> int {for (int i = 0; i < 3; ++i) {printf("async is running\n");std::this_thread::sleep_for(std::chrono::milliseconds(10));}return 100;});int ret = f.get();printf("result is %d\n", ret);return 0;
}

示例3 std::function 作为参数

#include <stdio.h>
#include <thread>
#include <future>
#include <chrono>
#include <functional>int main()
{std::function<int(void)> func = []() -> int {for (int i = 0; i < 3; ++i) {printf("async is running\n");std::this_thread::sleep_for(std::chrono::milliseconds(10));}return 100;};auto f = std::async(func);int ret = f.get();printf("result is %d\n", ret);return 0;
}

相关文章:

c++ async 使用详解,创建异步任务的多种方法

c async 使用详解 std::async 头文件 #include <future>。 函数原型&#xff1a; template<class Function, class... Args> std::future<std::invoke_result_t<std::decay_t<Function>,std::decay_t<Args>...>>async(std::launch polic…...

万物皆数——用matlab求解二阶微分方程

一、背景 毕达哥拉斯的“万物皆数”哲学观点表达了一个理念&#xff0c;即宇宙万物都可以通过数学语言来描述&#xff0c;数是万物的本原。 勾股定理就是毕达哥拉斯提出&#xff0c;因此在西方勾股定理也被叫做毕达哥拉斯定理。 工科类的专业&#xff0c;越到后面越感觉到数学…...

jmeter接口自动化部署jenkins教程

首先&#xff0c;保证本地安装并部署了jenkins&#xff0c;jmeter&#xff0c;xslproc 我搭建的自动化测试框架是jmeterjenkinsxslproc ---注意&#xff1a;原理是&#xff0c;jmeter自生成的报告jtl文件&#xff0c;通过xslproc工具&#xff0c;再结合jmeter自带的模板修改&…...

前端js实现将数组对象组装成自己需要的属性,或者去掉对象中不必要的属性

前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 需求&#xff1a;前端js实现将数组对象组装成自己需要的属性&#xff0c;或者前端js实现去掉对象中不必要的属性 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、示例数组对象…...

MeterSphere 任意文件读取漏洞(CVE-2023-25814)

MeterSphere 任意文件读取漏洞&#xff08;CVE-2023-25814&#xff09; 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: title"MeterSphere" 漏洞复现1. 构造poc2. 发送数据包3. 查看文件 免责声明 仅用于技术交流,目的是向相关安全人员展示漏洞利用方式,以便更好地…...

设计模式-01-单例设计模式

经典的设计模式有23种&#xff0c;但是常用的设计模式一般情况下不会到一半&#xff0c;我们就针对一些常用的设计模式进行一些详细的讲解和分析&#xff0c;方便大家更加容易理解和使用设计模式。 1-为什么要使用单例 单例设计模式&#xff08;Singleton Design Pattern&…...

霍尔电流传感器如何进行可靠性测试?主要应用在哪些领域?

霍尔电流传感器广泛应用于航空航天、电源监测、飞行器状态监测、变速驱动设备、焊接设备供电电源、新能源汽车蓄电池管理系统等领域&#xff0c;在电流检测领域中有着重要地位和实用价值&#xff0c;在电驱系统中被称为新能源汽车的动力“心脏”。因此&#xff0c;霍尔电流传感…...

pandas按行按列遍历Dataframe的三种方式

遍历数据有以下三种方法&#xff1a; 简单对上面三种方法进行说明&#xff1a; iterrows(): 按行遍历&#xff0c;将DataFrame的每一行迭代为(index, Series)对&#xff0c;可以通过row[name]对元素进行访问。 itertuples(): 按行遍历&#xff0c;将DataFrame的每一行迭代为元…...

Api接口如何防止被刷?

现在越来越多的应用程序和服务都提供了API接口&#xff0c;使得开发人员可以方便地与这些应用程序和服务进行交互。但是&#xff0c;由于API接口是公开的&#xff0c;因此很容易被黑客利用&#xff0c;对系统造成损害。为了确保API接口的安全性&#xff0c;我们需要采取一些措施…...

Django——orm模块创建表关系

django orm中如何创建表关系 1. 表关系分析 表与表之间的关系: 一对多 多对多 一对一 没有关系 判断表关系的方法: 换位思考用4张表举例: 图书表 出版社表 作者表 作者详情表图书和出版社是一对多的关系 外键字段建在多的那一方图书和作者是多对多的关系 需要创建第三张表来…...

Django知识点

目录 一、三板斧的使用 二、全局配置文件 三、静态文件的设置 四、request对象的方法 五、pycharm链接数据库 六、Django链接数据库 七、orm介绍 一、三板斧的使用 三个方法&#xff1a; HttpResponse renderredirect def index(request):print(request)return HttpR…...

基于单片机设计的智能风扇(红外线无线控制开关调速定时)

一、项目介绍 在炎热的夏季&#xff0c;风扇成为人们室内生活中必不可少的电器产品。然而&#xff0c;传统的风扇控制方式存在一些不便之处&#xff0c;比如需要手动操作开关、无法远程控制和调速&#xff0c;以及缺乏定时功能等。为了解决这些问题&#xff0c;设计了一款基于…...

k8s报错pause 3.2 解决方案

报错 Failed to create pod sandbox: rpc error: code Unknown desc failed to get sandbox image "k8s.gcr.io/pause:3.2": failed to pull image "k8s.gcr.io/pause:3.2": failed to pull and unpack image "k8s.gcr.io/pause:3.2": failed…...

基于遗传算法的电器分类,基于GA的电器分类

目录 背影 遗传算法的原理及步骤 基本定义 编码方式 适应度函数 运算过程 代码 结果分析 展望 完整代码下载链接:基于遗传算法的电器识别,基于遗传算法的电器分类(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88506649 背影 电器…...

某XX自考小程序的AES加密分析

前言 主要是报了自考在这个小程序上面做题&#xff0c;就研究了一下这个接口本文仅供学习交流使用&#xff0c;请勿随意传播。如有侵犯你的权益及时联系我删除。 一、抓包分析打开小程序&#xff0c;打开devtools 工具&#xff0c;这里就不啰嗦&#xff0c;直接上过程。 点击…...

加密算法笔记

MD5: 目前相对容易破解&#xff0c;且容易发生碰撞; 不可逆(但是网络上有很多破解方法) SHA256: 不会碰撞; 可以加盐&#xff0c;也可以不加盐; 不可逆; HmacSHA256在线加密-HmacMD5加密-散列哈希HASH加密工具 相同点 1、都是密码散列函数&#xff0c;加密不可逆。 2、都可…...

Sa-Token拦截全部接口必须登录-然后自定义注解来匿名登录-作为权限框架支持,并且同时使用了注解和路由的拦截器模式,此部分的配置如下:

场景 在博主目前正在开发的项目中&#xff0c;就采用了Sa-Token作为权限框架支持&#xff0c;并且同时使用了注解和路由的拦截器模式&#xff0c;此部分的配置如下&#xff1a; Override public void addInterceptors(InterceptorRegistry registry) { List<String> n…...

公司企业端口映射

文章目录 前言如何进行内网映射打开路由器管理网址设置端口映射 前言 公司为了提供稳定的网络服务&#xff0c;需要拥有一个稳定的IPV4的网络地址&#xff0c;一般公司有点规模的&#xff0c;会去电信局里面拉一根专门的网线&#xff0c;获取稳定的全球IPV4地址。 一个IPV4地…...

gitlab安装和使用

gitlab安装和使用 1.下载必要的依赖 sudo yum install curl openssh-server openssh-clients postfix cronie #需要执行sudo service postfix start #配置邮箱的sudo chkconfig postfix on #配置邮箱的#这句是用来做防火墙的&#xff0c;避免用户通过ssh方式和http来访问。su…...

【论文阅读】DALL·E: Zero-Shot Text-to-Image Generation

OpenAI第一代文本生成图片模型 paper&#xff1a;https://arxiv.org/abs/2102.12092 DALLE有120亿参数&#xff0c;基于自回归transformer&#xff0c;在2.5亿 图片-文本对上训练的。实现了高质量可控的text to image&#xff0c;同时也有zero-shot的能力。 DALL-E没有使用扩…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...