浅谈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:\…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...