C++11 新特性之future和packaged_task
C++11 新特性之future
#include <iostream>
#include <thread>
#include <future>
#include <chrono>void test(std::promise<int>& probj){std::this_thread::sleep_for(std::chrono::seconds(5));probj.set_value(20);
}int main(){std::promise<int> obj;std::future<int> features = obj.get_future();std::thread th(test, std::ref(obj));int ans = features.get();std::cout<<"value: "<<ans<<std::endl;th.join();return 0;
}
packaged_task 和 async() 是 C++ 中用于实现异步任务的工具。
packaged_task 是一个类模板,它允许将函数或可调用对象封装为一个异步任务。它包装了一个函数或可调用对象,并可以通过调用 operator() 来执行该任务。同时,它还提供了一个与该任务关联的 std::future 对象,用于获取任务的结果。
使用 packaged_task 的一般步骤如下:
1、创建一个 packaged_task 对象,并将要执行的函数或可调用对象传递给它的构造函数。
通过调用 get_future() 获取与 packaged_task 关联的 std::future 对象,用于获取任务的返回值。
2、将 packaged_task 对象传递给一个线程或者其他异步执行的机制,以便在另一个线程上执行任务。
3、在需要获取结果时,通过调用 std::future 对象的 get() 方法来等待任务完成并获取结果。
packaged_task 提供了一种将异步任务与其结果关联起来的方式,使得在一个线程中执行任务并在另一个线程中获取结果变得更加方便。
#include <iostream>
#include <thread>
#include <future>
#include <chrono>int add(int a, int b){std::this_thread::sleep_for(std::chrono::seconds(2));return a+b;
}int main(){// 将任务函数进行打包std::packaged_task<int(int, int)> task(add);std::future<int> futureObj = task.get_future();std::thread th(std::move(task), 10, 20);int ans = futureObj.get();std::cout<<ans<<std::endl;th.join();return 0;
}
当使用 std::async() 函数时,可以通过指定不同的策略来控制任务的执行方式。这里有三种策略可供选择:
默认策略(默认参数):
当没有指定策略时,std::async() 将使用默认策略。这里的默认策略是由编译器和运行时环境决定的,其行为可以是在新线程中执行任务,也可以是在当前线程中执行任务。编译器和运行时环境会根据系统资源、负载和其他因素来选择最佳的执行方式。
例如,如果当前线程已经有空闲的线程资源可用,编译器可能会决定在当前线程中执行任务。这样可以避免额外的线程创建和上下文切换开销。
无论任务在哪个线程中执行,你仍然可以使用 std::future 对象来获取任务的结果。
std::launch::async 策略:
使用 std::launch::async 标志作为 std::async() 的第一个参数,可以显式地要求任务在新线程中执行。这将确保任务在新线程中独立地执行,而不会占用当前线程。
例如,以下代码将使用 std::launch::async 策略来启动一个异步任务,任务将在新线程中执行:
std::future<int> futureObj = std::async(std::launch::async, add, 10, 20);
使用 std::launch::async 策略时,std::async() 函数将创建一个新线程来执行任务,从而实现异步执行。
std::launch::deferred 策略:
使用 std::launch::deferred 标志作为 std::async() 的第一个参数,可以延迟任务的执行。这意味着任务将不会立即在新线程中执行,而是在调用 std::future 对象的 get() 或 wait() 方法时执行。
例如,以下代码将使用 std::launch::deferred 策略来启动一个延迟执行的任务:
std::future<int> futureObj = std::async(std::launch::deferred, add, 10, 20);
使用 std::launch::deferred 策略时,std::async() 函数不会创建新线程。相反,任务的执行将延迟到调用 get() 或 wait() 方法时,可能在当前线程中执行。
需要注意的是,这些策略的行为取决于编译器和运行时环境的实现,所以具体的结果可能因实际情况而异。默认策略是最常用的,它会根据环境自动选择最佳的执行方式。如果需要确保任务在新线程中执行,可以使用 std::launch::async 策略。如果需要延迟任务的执行,可以使用 std::launch::deferred 策略。但请注意,延迟执行的任务只会在调用 get() 或 wait() 方法时执行,而不会在后台线程中进行。
相关文章:
C++11 新特性之future和packaged_task
C11 新特性之future #include <iostream> #include <thread> #include <future> #include <chrono>void test(std::promise<int>& probj){std::this_thread::sleep_for(std::chrono::seconds(5));probj.set_value(20); }int main(){std::pr…...
Flutter APP下载更新
由于我做的项目不是放在APP商店(公司内部用)的,一些flutter的第三方库不合适我,我需要用的是从网上下载再安装(从服务下),网上也找了花了我好几天时间。不全又乱,这我自己做一下备份…...
Pinctrl子系统_04_Pinctrl子系统主要数据结构
引言 本节说明Pinctrl子系统中主要的数据结构,对这些数据结构有所了解,也就是对Pinctrl子系统有所了解了。 前面说过,要使用Pinctrl子系统,就需要去配置设备树。 以内核面向对象的思想,设备树可以分为两部分&#x…...
设计模式(十):抽象工厂模式(创建型模式)
Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对 象的接口,而无须指定它们的具体类。 之前写过简单工厂和工厂方法模式(创建型模式),这两种模式比较简单。 简单工厂模式其实不符合开闭原则,即对修改关闭…...
计算机网络概论01
计算机系统基础知识 基本组成 计算机系统由硬件和软件组成。 硬件由五大部分,他们分别是: 运算器 执行算数运算和逻辑运算控制器 控制cpu的工作,决定了计算机运行过程的自动化。包括指令控制逻辑、时序控制逻辑、总线控制逻辑和中断控制逻辑…...
新零售SaaS架构:订单履约系统架构设计(万字图文总结)
什么是订单履约系统? 订单履约系统用来管理从接收客户订单到将商品送达客户手中的全过程。 它连接了上游交易(客户在销售平台下单环)和下游仓储配送(如库存管理、物流配送),确保信息流顺畅、操作协同&…...
Hive SQL 开发指南(三)优化及常见异常
在大数据领域,Hive SQL 是一种常用的查询语言,用于在 Hadoop上进行数据分析和处理。为了确保代码的可读性、维护性和性能,制定一套规范化的 Hive SQL 开发规范至关重要。本文将介绍 Hive SQL 的基础知识,并提供一些规范化的开发指…...
Spring Boot 自动装配的原理!!!
SpringBootApplication SpringBootConfiguration:标识启动类是一个IOC容器的配置类 EnableAutoConfiguration: AutoConfigurationPackage:扫描启动类所在包及子包中所有的组件,生…...
Linux运维_Bash脚本_编译安装Wayland-1.22.0
Linux运维_Bash脚本_编译安装Wayland-1.22.0 Bash (Bourne Again Shell) 是一个解释器,负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件,并于 1989 年发布的免费软件,作为 Sh (Bourne Shell) 的替代品。 您可以在 Linu…...
Python数字类型
文章目录 Python数字类型1. 数字类型1.1 数字类型概述1.2 整数类型1.3 浮点数类型1.4 复数 2. 数字类型的操作2.1 内置的数值运算操作符2.2 内置的数值运算函数2.3 内置的数字类型转换函数 思考与练习 Python数字类型 1. 数字类型 1.1 数字类型概述 数字是自然界计数活动的抽…...
每天一个数据分析题(一百九十六)
在多元线性回归模型的自变量选择方法中,关于向后回归法和逐步回归法的描述,以下哪些是正确的? A. 向后回归法开始时包含所有自变量,并逐步剔除每个不显著的变量。 B. 逐步回归法结合了向前回归法和向后回归法,可以在…...
华为北向网管NCE开发教程(1)闭坑选接口协议
华为北向网管NCE开发教程(1)闭坑选接口协议 华为北向网管NCE开发教程(2)REST接口开发 华为北向网管NCE开发教程(3)CORBA协议开发 本文一是记录自己开发华为北向网管遇到的坑,二是给需要的人&…...
JavaScript极速入门-综合案例(3)
综合案例 猜数字 预期效果 代码实现 <button type"button" id"reset">重新开始一局游戏</button><br>请输入要猜的数字:<input type"text" id"number"><button type"button" id"button&q…...
RabbitMQ架构详解
文章目录 概述架构详解核心组件虚拟主机(Virtual Host)RabbitMQ 有几种广播类型 概述 RabbitMQ是⼀个高可用的消息中间件,支持多种协议和集群扩展。并且支持消息持久化和镜像队列,适用于对消息可靠性较高的场合 官网https://www.…...
编译内核错误 multiple definition of `yylloc‘
编译内核错误 # make ARCHarm CROSS_COMPILEarm-mix410-linux- uImageHOSTLD scripts/dtc/dtc /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss0x10): multiple definition of yylloc; scripts/dtc/dtc-lexer.lex.o:(.bss0x0): first defined here collect2: error: ld ret…...
深度学习模型部署(四)常用模型及推理平台评估指标
判断选择什么模型,什么量化方案,什么推理框架,最基础的知识就是如何评估自己的模型以及推理平台。 模型衡量标准 衡量一个模型的最直接标准就是运算速度,但是运算速度是无法计算的,所以定义了一些间接标准来推测模型的…...
【控制台警告】npm WARN EBADENGINE Unsupported engine
今天用webpack下载几个loader依赖,爆出了三个警告,大概的意思就是本地安装的node和npm的版本不是很匹配? 我的解决思路是: 先检查node和npm版本 然后去官网查找版本的对应 靠,官网404 Node.js (nodejs.org) 就找到…...
ArmSoM Rockchip系列产品 通用教程 之 GPIO 使用
1. GPIO简介 GPIO,全称 General-Purpose Input/Output(通用输入输出),是一种在计算机和嵌入式系统中常见的数字输入输出接口。它允许软件控制硬件的数字输入和输出,例如开关、传感器、LED灯等。GPIO通常由一个芯片或…...
npm镜像源地址
镜像源地址替换问题(重要) 2024 年 1 月 22 日 ,registry.npm.taobao.org 的 SSL 证书正式过期。 2022 年 5 月 淘宝源发布了公告: (大家应该没有太多关注哦,也包括我,哈哈) &am…...
Java的Writer类详解
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…...
用Python+Pyomo搞定差速机器人轨迹跟踪:一个NMPC实战案例(附完整代码)
用PythonPyomo实现差速机器人NMPC轨迹跟踪:从原理到工程实践 差速驱动机器人在自动仓储、服务机器人等场景应用广泛,而精准的轨迹跟踪是其核心能力。传统PID控制在复杂路径下表现欠佳,非线性模型预测控制(NMPC)因其前瞻…...
Magpie深度解析:3大技术突破重构Windows窗口放大体验
Magpie深度解析:3大技术突破重构Windows窗口放大体验 【免费下载链接】Magpie A general-purpose window upscaler for Windows 10/11. 项目地址: https://gitcode.com/gh_mirrors/mag/Magpie 在Windows系统中,窗口放大工具长期面临"清晰度与…...
一场关于美国海军如何将基于Spring框架的企业级Java应用迁移、适配或部署到Web环境的技术分享
网络研讨会(Webinar Replay)标题“Bringing Spring Apps to the Web at the US Navy”表明这是一场关于美国海军如何将基于Spring框架的企业级Java应用迁移、适配或部署到Web环境的技术分享。可能涵盖内容包括: Spring Boot / Spring MVC 应用…...
终极虚拟手柄驱动:ViGEmBus如何彻底改变Windows游戏控制器兼容性
终极虚拟手柄驱动:ViGEmBus如何彻底改变Windows游戏控制器兼容性 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款革命性的Windows…...
深入理解 Python 中的异步迭代
一、为什么异步迭代值得单独讨论 在同步程序中,迭代的核心问题是“如何逐个取值”;而在异步程序中,真正棘手的问题变成了“当下一个值尚未准备好时,控制权应交还给谁”。Python 的异步迭代正是为此而设计:它将“逐个产…...
别再手动写CRUD了!用renren-generator 3分钟搞定SpringBoot项目基础代码(附MyBatis-Plus配置)
3分钟极速生成SpringBoot全栈代码:renren-generator深度实践指南 每次启动新项目时,那些重复的CRUD代码是否让你感到厌倦?我曾在一个电商平台项目中,手动编写了37张表的增删改查接口,整整耗费两周时间。直到发现renren…...
保姆级教程:用QMT打造全天候ETF自动交易系统(黄金/纳指/国债组合实战)
全天候ETF自动交易实战:用QMT构建黄金/纳指/国债智能组合 早上7点,当大多数上班族还在通勤路上,你的投资组合已经根据隔夜市场波动完成了自动调仓——这就是全天候交易系统的魅力。不同于传统盯盘方式,我们将通过QMT平台实现"…...
2025年网盘直链下载终极解决方案:八大网盘全速下载完全指南
2025年网盘直链下载终极解决方案:八大网盘全速下载完全指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…...
一键激活Windows和Office:告别繁琐的智能KMS工具指南
一键激活Windows和Office:告别繁琐的智能KMS工具指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为系统激活烦恼吗?KMS_VL_ALL_AIO 是你的终极解决方案ÿ…...
告别错位检测!用S2A-Net搞定航拍图像中的任意方向目标(附PyTorch代码实战)
航拍图像目标检测实战:S2A-Net从原理到PyTorch实现 航拍图像中的目标检测一直是计算机视觉领域的难点——密集排列的车辆、任意角度的建筑物、形态各异的自然景观,这些目标在传统检测框架下常常出现特征错位问题。今天我们要深入探讨的S2A-Net࿰…...
