C++异步编程小论

目录

std::async与std::future

其他

std::package_task

std::promise

Reference


浅论:我看有人写的浅论异步编程的文章实际上在干的是介绍多线程,这里刚好最近对异步编程有所兴趣:我们来看看几个C++11新加进来的一些异步编程关键字。

这里需要对线程编程有所概念了我们好方便阅读,所以简单的想看看本文请先对多线程有一个基本的了解。

我们的本篇文章的主角是:std::asyncstd::futurestd::package_taskstd::promise等。

std::asyncstd::future

std::async - cppreference.com

std::future - cppreference.com

异步的前几个字母!也就是说,我们这里就会创建一个异步的线程!默认的,他封装了std::thread以及将线程派发和发起线程的线程之间的沟通的几个流程,从复杂的需要自行定义的类封装转向了使用几个简单的关键字就可以完成任务。

auto future_res = std::async(task, params); # 这里的auto就是对应的std::future

我们需要传递什么呢?传递需要被线程执行的函数和她所需要的参数!

我们接受什么呢?一个叫做std::future的模板类!这样理解:我们的线程工作是需要时间的,我们的结果在发起异步的时候尚无,但是我们预留了位置给线程执行的结果(从未来来hhh),所以叫std::future

std::future需要被实例化为函数返回的结果的类型。其中,我们的结果需要以方法.get来获取!如果异步操作还没有结束,那么会在此等待异步操作的结束,并获取返回的结果。wait()只是在此等待异步操作的结束,并不能获得返回结果。wait_for()超时等待返回结果。

我们来看一个稍微复杂的例子

template<typename... Args>
int fastFunc(Args... a) {
    return (... + a);
}
​
int main(){
    auto res = std::async(fastFunc<int, int, int>, 1, 2, 3);
    std::cout << res.get();
}

我们的函数流是这样执行的,

也就是说,我们总是可以保证在.get调用处拿到函数执行的结果!

async实际上有两种执行flag:仔细想想:你要不一发起就执行异步线程,要不等到你需要get的时候才执行:

std::launch::deferred:设置了deferred标志,则async将进行惰性求值,即在async返回的std::future调用get函数时,将在当前线程(不一定是调用async时的线程)进行求值。 std::launch::async:设置了async标志,则async在新的线程执行函数f。(默认的是这个)

我们的async也为此设置了等待流程:比如说如果我们的线程执行超时了,我们应该如何处理:我们可以通过future_status去查询future的三种状态,分别是deferred(还未执行),ready(已经完成),timeout(执行超时),所以我们可以通过这个去查询异步操作的状态。使用这三种状态就OK!

template<typename... Args>
int slowFunc(int sleepTime, Args... a){
    std::this_thread::sleep_for(std::chrono::seconds(sleepTime));
    return (... + a);
}
​
int main()
{
    auto sleepTime = 5; // 假设的耗时时间
    auto waitTime = 3;  // 我们决定等待的时间
    auto wait_for = std::async(slowFunc<int, int>, sleepTime, 1, 2);
    switch (wait_for.wait_for(std::chrono::seconds(waitTime)))
    {
    case std::future_status::ready:     // 执行完事了!
        std::cout << "For this case, the waiting is enough!:>\n" << wait_for.get();
        break;
    case std::future_status::deferred:  // 设置了std::launch::deferred
        std::cout << "For your set! the func depatched!:>\n" << wait_for.get();
        break;
    case std::future_status::timeout: // 执行超时了!
        std::cout << "Shit bro! the task timeout!:>\n " << wait_for.get();
        break;
    default:
        break;
    }
}

其他

我们可以认为std::async是零散的由:std::futurestd::packaged_taskstd::promise等类

std::package_task

std::packaged_task - cppreference.com

std::packaged_task是一个类模板,顾名思义是用来打包的,将一个可调用对象封装起来,然后可以将其的返回值传给future。std::packaged_task<函数返回类型(参数类型)> 变量名(函数名)。

这个打包起来的任务要是想获得给我们所用的等待体,调用get_future方法先接受,之后塞到线程里执行就可以。

std::promise

std::promise - cppreference.com

std::promise是一个类模板,它的作用是在不同的线程中实现数据的同步,与future结合使用,也间接实现了future在不同线程间的同步。他与future是结合使用的。(future和promise相互关联)

#include <iostream>
#include <future>
#include <thread>
​
int fun(int x, std::promise<int>& p) {
    x++;
    x *= 10;
    p.set_value(x);
    std::cout << std::this_thread::get_id() << std::endl;
    return x;
}
​
​
int main()
{
    std::promise<int> p;
    std::future<int> fu = p.get_future();        // 并将结果返回给future
    std::thread t(fun, 1, std::ref(p));
    std::cout << fu.get() << std::endl;          // 当promise还没有值的时候在此等待
    std::cout << std::this_thread::get_id() << std::endl;
    t.join();
    return 0;
}

Reference

C++11异步编程(std::async, std::future, std::packaged_task, std::promise)-腾讯云开发者社区-腾讯云 (tencent.com)

C++11中std::async的使用详解_std::sync-CSDN博客

std::thread- cppreference.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/563358.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

揭开ChatGPT面纱(3):使用OpenAI进行文本情感分析(embeddings接口)

文章目录 一、embeddings接口解析二、代码实现1.数据集dataset.csv2.代码3.运行结果 openai版本1.6.1 本系列博客源码仓库&#xff1a;gitlab&#xff0c;本博客对应文件夹03 在这一篇博客中我将使用OpenAI的embeddings接口判断21条服装评价是否是好评。 首先来看实现思路&am…

视频教程下载:用ChatGPT的 API 开发AI应用指南

通过这门关于 OpenAI API 和 ChatGPT API 的全面课程&#xff0c;在您的应用中释放人工智能的力量。随着人工智能技术的快速发展&#xff0c;比以往任何时候都更重要的是保持领先地位&#xff0c;并为您的项目利用这些尖端工具。在本课程中&#xff0c;您将深入了解人工智能驱动…

每日论文推荐:Prismatic VLMs VLM设计经验总结

&#x1f4cc; 元数据概览&#xff1a; 标题&#xff1a;“Prismatic VLMs: Investigating the Design Space of Visually-Conditioned Language Models”作者&#xff1a;Siddharth Karamcheti, Suraj Nair, Ashwin Balakrishna, Percy Liang, Thomas Kollar, Dorsa Sadigh&a…

LLM学习笔记-2

在未标记数据上进行预训练 本章概要 在上节的笔记中&#xff0c;因为训练出的效果&#xff0c;并不是特别理想&#xff0c;在本节中&#xff0c;会用数据进行训练&#xff0c;使得模型更加的好&#xff1b; 计算文本生成损失 inputs torch.tensor([[16833, 3626, 6100],…

SpringBoot 操作 Redis

导入对应版本的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>修改配置文件中的信息 spring:redis:host: 127.0.0.1port: 8888注意: 我这里 xsh…

springboot注解开发如何映射对象型数据

创作灵感 最近在帮学校写一款小程序时&#xff0c;有这样一个数据需要展示&#xff1a;一条申请记录&#xff0c;里面包含了申请时间、申请状态、申请所提供的六条活动记录等待&#xff0c;其中&#xff0c;申请所提供的六条活动记录为一个数组&#xff0c;数组中的每个元素又…

面板数据门槛归回分析,xthreg的安装,xthreg2安装包

我用的是Stata17,数据是不平衡的面板数据,需要用到xthreg2,虽然我找到了xthreg2.ado,但是还需要安装xthreg,因为运行xthreg2需要xthreg包顺带安装的lxthreg.mlib文件。但是!我后来发现还是不行,最后是去买了一个真正能用到xthreg2的lxthreg.mlib文件,才可以运行。 一、…

[图解]软件开发中的糊涂用语-04-为什么要追究糊涂用语

0 00:00:00,030 --> 00:00:05,620 今天呢&#xff0c;我们来说一个为什么要追究糊涂用语的问题 1 00:00:06,310 --> 00:00:06,548 2 00:00:06,548 --> 00:00:11,077 大家知道我们前些天都发了好几个视频 3 00:00:11,077 --> 00:00:13,461 追究这个糊涂用语 4 00…

2024免费专为Mac用户设计的清理和优化工具CleanMyMac X

CleanMyMac X是一款专为Mac用户设计的清理和优化工具。以下是对CleanMyMac X的详细介绍&#xff1a; 一、主要功能 系统清理&#xff1a;CleanMyMac X能够智能扫描Mac的磁盘空间&#xff0c;识别并清理各种垃圾文件&#xff0c;这些垃圾文件包括重复文件、无用的语言安装包、i…

五.音视频编辑-音频混合-应用

引言 音频混合技术是一项强大的工具&#xff0c;可以为应用程序增添丰富的功能和用户体验。在前一篇博客中&#xff0c;我们深入探讨了AVFoundation框架中的音频混合基础知识和实现方法。现在&#xff0c;让我们进一步探索&#xff0c;看看如何将这些技术应用到实际项目中。 …

Django项目无法安装python-ldap依赖解决方案

最近工作中安排了一个Python web项目&#xff0c;使用Pycharm从git拉取代码后&#xff0c;配置号Python的解释器和pip后&#xff0c;Pycharm自动下载安装项目所需的依赖&#xff0c;但是有一个依赖django-auth-ldap4.1.0安装始终失败&#xff0c;最初的异常信息提示是&#xff…

Java客户端如何直接调用es的API

Java客户端如何直接调用es的API 一. 问题二. withJson 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 问题 今天做项目的时候&#xff0c;想要直接通过java客户端调用es的api…

解决Django中调页面时出现“Did you forget to register or load this tag”报错

解决Django中调页面时出现“Did you forget to register or load this tag?”报错 1.问题收录 2.分析问题 在HTML文件中&#xff0c;{{title}}&#xff0c;{{lanyy}}&#xff0c;django 默认规定的语法&#xff0c;用{{}}包起来的变量叫做模板变量。 django渲染模板时会将大…

2.1K Star微软开源的高质量 iot库

功能描述 该项目是一个开源的 .NET Core 实现&#xff0c;旨在帮助开发者构建适用于物联网(IoT)设备和场景的应用程序。它提供了与传感器、显示器和输入设备等相互作用所需的 GPIO 引脚、串口等硬件的接口。该仓库包含 System.Device.Gpio 库以及针对各种板卡&#xff08;如 Ra…

论文笔记:Time-LLM: Time Series Forecasting by Reprogramming Large Language Models

iclr 2024 reviewer 评分 3888 1 方法 提出了 Time-LLM&#xff0c; 是一个通用的大模型重编程&#xff08;LLM Reprogramming&#xff09;框架将 LLM 轻松用于一般时间序列预测&#xff0c;而无需对大语言模型本身做任何训练 为什么需要时序数据和文本数据对齐&#xff1a;时…

vi, vim,data,wc,系统常用命令-读书笔记(十)

vi 文本编辑器 基本上 vi 共分为三种模式&#xff0c;分别是“一般指令模式”、“编辑模式”与“命令行命令模式”。这三种模式的作用分别是&#xff1a; 一般指令模式&#xff08;command mode&#xff09;以 vi 打开一个文件就直接进入一般指令模式了&#xff08;这是默认的…

分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测

分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测 目录 分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Mat…

frp改造Windows笔记本实现家庭版免费内网穿透

文章目录 前言frp原理Windows服务端IP检验IP固定软件下载端口放行端口映射开机启动 NAS客户端端口查询软件下载端口检验穿透测试自启设置 Ubuntu客户端软件下载后台启动 后记 前言 之前一直用花生壳远程控制一个服务器&#xff0c;但最近内网的网络策略似乎发生了变化&#xf…

java中的异常机制

异常原理分析 在我们编写一个代码的时候必然会出现这样那样的问题&#xff0c;这些问题可能是明显的&#xff0c;也有可能是不明显的。从理论上来说&#xff0c;一个程序员应当具备处理代码出现的大多数问题的能力&#xff0c;但是这并不意味着程序员要思考处理所有的代码问题。…

硬盘日常使用中的注意事项

硬盘是计算机中的重要存储设备,负责存储大量的数据。为了确保数据的完整性和硬盘的寿命,日常使用中需要注意以下几点: 避免震动和撞击:硬盘在工作时,内部的磁盘正在高速旋转,任何轻微的震动或撞击都可能导致磁盘损坏或数据丢失。因此,使用硬盘时应确保计算机放置稳定,避…