浅谈C++的future
std::future 是 C++ 标准库中的一个模板类,提供了一种机制来管理和获取异步任务的结果。它常与异步操作相关,允许你在不同线程中执行任务,并在将来(即“未来”)某个时刻获取这些任务的结果。std::future 通常和 std::async、std::promise、std::packaged_task 等其他类一起使用,用于实现异步编程。
为什么需要 std::future?
-
异步任务结果管理:
- 当你在一个新线程或异步操作中执行任务时,你希望能够在任务完成后获取它的结果。
std::future提供了一种安全的方式来获取这些结果。 - 与
thread.join()不同,future不会在任务运行时阻塞主线程,它允许主线程继续执行其他操作,直到任务完成。
- 当你在一个新线程或异步操作中执行任务时,你希望能够在任务完成后获取它的结果。
-
任务完成时的同步:
std::future提供了阻塞和非阻塞的机制来同步任务。你可以调用get()来等待任务完成,也可以使用wait_for()或wait_until()来检查任务是否已经完成。
-
防止数据竞争:
std::future的机制避免了线程间的数据共享问题。它通过提供一种类型安全的、线程安全的方式,将任务的结果传递回主线程,而不需要使用锁或其他同步原语来避免数据竞争。
std::future 的基本用法:
std::future 是通过异步调用(如 std::async)生成的。当任务开始执行时,std::future 用于获取该任务的返回值。下面是一个简单的示例,展示了如何使用 std::future 和 std::async:
#include <iostream>
#include <future>
#include <chrono>
#include <thread>// 一个简单的异步任务函数
int task() {std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时任务return 42;
}int main() {// 使用 std::async 启动异步任务,并返回 future 对象std::future<int> result = std::async(std::launch::async, task);// 主线程可以在此期间做其他事情std::cout << "Doing other work in main thread...\n";// 阻塞等待异步任务完成,并获取结果int value = result.get(); // 这里阻塞直到 task() 完成并返回结果std::cout << "Task result: " << value << std::endl;return 0;
}
解释:
std::async:它启动一个异步任务(可以理解为在另一个线程中运行),并返回一个std::future对象。std::future:它包含了任务的返回值。在调用result.get()之前,std::future中的结果是不可用的。get()会阻塞当前线程,直到异步任务完成并返回结果。- 任务的异步执行:在调用
result.get()之前,主线程不会被任务阻塞,可以继续执行其他操作。
std::future 的关键操作:
-
get():- 阻塞当前线程,直到异步任务完成,并返回任务的结果。
- 如果任务已经完成,
get()会立即返回结果。 - 只能调用一次,调用后
std::future将不再拥有结果。
-
wait():- 阻塞当前线程,直到异步任务完成,但不会返回任务的结果。可以用于等待任务完成,但不需要立即获取结果。
-
wait_for(duration):- 阻塞一段指定的时间(
duration),如果任务在这段时间内完成,则返回std::future_status::ready,否则返回timeout或deferred。
- 阻塞一段指定的时间(
-
wait_until(time_point):- 等待直到某个时间点,如果任务在此之前完成,则返回
std::future_status::ready。
- 等待直到某个时间点,如果任务在此之前完成,则返回
std::future 的典型应用场景:
-
异步任务的返回值:
- 当你需要在另一个线程中执行一个任务,并且希望稍后获取这个任务的返回值,
std::future就是最好的选择。例如在下载文件、计算密集型任务等场景中,可以在后台线程执行任务,主线程继续其他操作,任务完成时再获取结果。
- 当你需要在另一个线程中执行一个任务,并且希望稍后获取这个任务的返回值,
-
并行计算:
- 你可以使用多个
std::future来并行运行多个任务,并在所有任务完成后再获取所有的结果。
- 你可以使用多个
-
异步回调替代:
- 传统的异步编程通常使用回调函数来处理任务的完成状态,但
std::future提供了一种更加简洁和清晰的方式来管理异步任务,避免了回调地狱的问题。
- 传统的异步编程通常使用回调函数来处理任务的完成状态,但
为什么要有 std::future 这种属性的存在?
-
简化异步编程:
std::future使得异步编程更加简洁直观,你可以像处理普通返回值一样处理异步任务的结果,而不必编写复杂的同步代码。
-
避免共享数据竞争:
std::future提供了一种无需锁定和同步机制的安全方式来在线程间传递数据,避免了传统多线程编程中的数据竞争问题。
-
灵活的任务管理:
- 通过
wait()、wait_for()等方法,std::future允许你灵活控制任务的执行和结果获取方式。例如,你可以选择阻塞等待任务,或者选择轮询任务状态以避免阻塞。
- 通过
总结:
std::future 提供了一种便捷的方式来处理异步任务的结果。它允许在异步任务运行的同时,主线程继续执行其他操作,直到任务完成后再获取结果。这种机制避免了使用回调函数的复杂性和数据竞争问题,简化了异步编程模型。
相关文章:
浅谈C++的future
std::future 是 C 标准库中的一个模板类,提供了一种机制来管理和获取异步任务的结果。它常与异步操作相关,允许你在不同线程中执行任务,并在将来(即“未来”)某个时刻获取这些任务的结果。std::future 通常和 std::asy…...
期货外盘行情源7个市场CTP推送式服务说明
在期货交易领域,及时、准确的市场行情信息是投资者做出决策的重要依据。为了满足广大期货投资者对国际期货市场信息的迫切需求,我们特别推出了“期货外盘行情源2千每月7个市场CTP推送式”服务。本服务旨在通过高效、稳定的技术手段,为投资者提…...
计算机毕业设计 | SSM 校园线上订餐系统(附源码)
1, 概述 1.1 项目背景 传统的外卖方式就是打电话预定,然而,在这种方式中,顾客往往通过餐厅散发的传单来获取餐厅的相关信息,通过电话来传达自己的订单信息,餐厅方面通过电话接受订单后,一般通…...
【iOS】使用一个单例通过AFNetworking来实现网络请求
【iOS】使用一个单例通过AFNetworking来实现网络请求 文章目录 【iOS】使用一个单例通过AFNetworking来实现网络请求前言OC网络请求的流程 使用单例的原因创建一个单例采用AFNetworking的网络申请 小结 前言 笔者这周主要学习了第三方库AFNetworking的使用,这里笔者…...
如何从模块内部运行 Pytest
在 Python 中,pytest 是一个强大的测试框架,用于编写和运行测试用例。通常我们会在命令行中运行 pytest,但是有时你可能希望从模块或脚本的内部运行 pytest,比如为了自动化测试或集成到某个工作流程中。 1、问题背景 当你从模块…...
oracle数据库---基本查询(单表查询、多表查询、子查询、分页查询、oracle内置函数、行列转换、集合运算)
思维导图 单表查询 数据准备 -- 练习的表如果存在 请先删除 -- 如果不存在直接创建 drop table t_owners;--业主表 create table t_owners (id number primary key,name varchar2(30),addressid number,housenumber varchar2(30),watermeter varchar2(30),adddate date,owner…...
web API基础
作用和分类 作用: 就是使用 JS 去操作 html 和浏览器 分类: DOM (文档对象模型)、 BOM (浏览器对象模型) 什么是DOM DOM (Document Object Model) 译为文档对象模型,是 HTML 和 XML 文档的编程接口。 HTML DOM 定义了访问和操作 …...
【C++】创建TCP服务端
实现了一个基本的 TCP 服务器,可以接受多个客户端连接,然后持续接收客户端发送的信息, 最后将接收到的信息再发送回客户端 。 源码 头文件(TCPServerTest.h) #include <iostream> #include <winsock2.h&g…...
每天练打字6:今日状况——常用字后五百击键3第2遍已完成,赛文速度93.56
今日跟打:763字 (截至当前) 总跟打:120408字 记录天数:2467天 (实际没有这么多天,这个是注册账号的天数) 平均每天:48字 本周目标完成进度: 练习常用单字后5…...
rk3568创建基于Ubuntu18.04交叉编译遇到的坑
尽管配置过rk3288,觉得rk3568也不会有啥问题,但还是掉坑了。 一、安装依赖库 安装完ubuntu后,先进行升级 sudo apt update sudo apt upgrade然后安装依赖库 $ sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-…...
对“一个中心,三重防护”中安全管理中心的理解
安全管理中心 本控制项为网络安全等级保护标准的技术部分。本项主要包括系统管理、审计管理、安全管理和集中管控四个控制点,其中的集中管控可以说是重中之重,主要都是围绕它来展开的。 28448基本要求中安全管理中心 8.1.5 安全管理中心 8.1.5.1 系统…...
jmeter用csv data set config做参数化1
在jmeter中,csv data set config的作用非常强大,用它来做批量测试和参数化非常好用。 csv data set config的常用配置项如下: Variable Names处,写上源文件中的参数名,用于后续接口发送请求时引用 Ignore first line…...
软件分享 丨eSearch 截图软件
在日常的工作和学习中,截图是一项非常常见且重要的操作。无论是记录重要的信息、制作教程,还是与他人分享有趣的内容,一款好用的截图软件都能让我们的效率大大提高。今天,就给大家分享一款功能强大的截图软件 - eSearch。 一、强…...
pytorh学习笔记——cifar10(一)生成数据
CIFAR(Canadian Institute For Advanced Research)是一个用于图像识别研究的数据集。CIFAR数据集包含多个子数据集,最常用的是CIFAR-10和CIFAR-100。 CIFAR-10数据集包含60000张32x32彩色图像,分为10个类别,每…...
pikachu靶场SSRF-curl测试报告
目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、实现ssrf攻击 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机:本机(127.0.0.1) 靶 机:本机(127.0.0.1) 2、使用工具/软件 测试网址:…...
Java项目-基于Springboot的农机电招平台项目(源码+说明).zip
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...
Systemd:简介
1号进程 Systemd是linux系统的守护进程,它要管理正在运行的 Linux 主机的许多方面,包括挂载文件系统、管理硬件、处理定时器以及启动和管理生产性主机所需的系统服务。 $ ps -u -p 1 USER PID %CPU %MEM VSZ RSS TTY STAT START TI…...
Snapshot包和Release包区别
Snapshot包和Release包区别 Snapshot包: 代表开发中的版本,可能不稳定。 经常更新,包含最新的功能和修复。 通常用于测试和开发阶段。 Release包: 代表稳定的、经过全面测试的版本。 版本号通常是固定的,适合生产环…...
最近网站频繁跳转到黑产网站,怀疑是51.la统计代码的问题
最近我的几个网站,都出现了一个问题,就是访问的时候会莫名其妙的跳转到黑产网站。 通过排查了网页代码,发现网页都有一个共同点,就是使用了51.la统计。为什么会怀疑是51la统计代码问题?因为我的网页只有统计代码外没有…...
【python_修改PPT中字体,run.font.name只对英文生效怎么办?】
python_修改PPT中字体,run.font.name只对英文生效怎么办? 参考:使用pptx_ea_font库设置中文字体 from pptx import Presentation from pptx.util import Pt from pptx_ea_font import set_font# 打开现有的 PPT 文件 prs Presentation(D:\…...
Nigate:Mac NTFS全功能读写解决方案——面向跨平台用户的高效文件交互指南
Nigate:Mac NTFS全功能读写解决方案——面向跨平台用户的高效文件交互指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting…...
告别‘选择困难症’:用Envelope Q-Learning让AI学会在《超级马里奥》里权衡金币与速度
告别‘选择困难症’:用Envelope Q-Learning让AI学会在《超级马里奥》里权衡金币与速度 想象一下,你正在玩《超级马里奥》,面对前方闪闪发光的金币和即将关闭的关卡大门,必须在"快速通关"和"收集财富"之间做出…...
AI 时代:祛魅、适应与重新定义宋
指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c #includ…...
用 SEONIB批量生成 SEO 博客来提升 Google 排名
用 SEONIB 批量生成 SEO 博客来提升 Google 排名,核心是:先用正确关键词+站内结构“打底”,再用 SEONIB 把这个结构规模化,最后用 Search Console 做数据反馈并持续优化。 下面是一套可以直接在团队里照着做的“SEONIB…...
西门子1200PLC与施耐德变频器Modbus通讯程序:实现变频启停、设定频率、读取电压、电流...
西门子1200plc与施耐德变频器modbus通讯程序,可以控制变频启停,设定频率,读取变频器电压、电流、运行频率,博图V14版本程序。直接上干货!今天咱们聊聊西门子S7-1200 PLC和施耐德ATV系列变频器的Modbus通讯实战。这个方…...
MVN--07
一、MyBatis 参数封装规则MyBatis 会根据接口方法的参数类型,自动进行不同的封装处理,核心由 ParamNameResolver 类实现。1. 单个参数的封装规则表格参数类型封装规则XML 中取值方式POJO 实体类直接使用,无需额外处理#{属性名}(属…...
别再只用针孔模型了!手把手教你用OpenCV的fisheye模块搞定鱼眼相机标定与去畸变
鱼眼相机标定实战:从OpenCV fisheye模块到工业级去畸变方案 鱼眼镜头在自动驾驶环视系统、VR全景拍摄和工业检测中越来越常见,但高达180度的视野带来的桶形畸变让许多开发者头疼。传统针孔模型标定方法在鱼眼镜头上完全失效——棋盘格边缘的直线会变成夸…...
ABB机器人编程避坑指南:从数据类型到运动指令的7个易错点
ABB机器人编程避坑指南:从数据类型到运动指令的7个易错点 第一次在RobotStudio里看到机器人因为数据类型错误突然停止时,我盯着报错信息足足愣了五分钟。这种经历在ABB机器人编程中并不罕见——从数据类型选择到运动指令参数设置,每个环节都可…...
C/C++ Socket网络编程 介绍
前言:对于C/C初学者来说,网络编程似乎是一道"门槛",而Socket就是打开这扇门的钥匙。今天我们一起来看看如何入门Socket网络编程。 目录 一、什么是Socket 二、Socket编程流程 三、TCP Socket编程示例 四、一些注意事项 一、什么…...
CSS 动画高级技巧:创建流畅的用户体验
CSS 动画高级技巧:创建流畅的用户体验掌握 CSS 动画的高级技巧,创建流畅、引人入胜的用户体验。一、动画基础回顾 作为一名追求像素级还原的 UI 匠人,我对 CSS 动画有着深入的研究。CSS 动画是现代前端开发的重要组成部分,它可以为…...
