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相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…...
5个DistroAV高级应用场景:企业视频制作与远程协作的终极指南
5个DistroAV高级应用场景:企业视频制作与远程协作的终极指南 【免费下载链接】obs-ndi DistroAV (formerly OBS-NDI): NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi DistroAV(前身为OBS-NDI)…...
FanControl深度解析:Windows平台精准风扇控制实践指南
FanControl深度解析:Windows平台精准风扇控制实践指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa…...
高效AI专著生成:实测4款工具,3天完成20万字专著写作!
在学术界,撰写一本专著对于研究者来说,绝不是一时冲动的结果,而是需要几年努力的“耐力赛”。从最早的选题阶段,到构建一个逻辑条理清晰的章节结构,再到逐步填充具体内容和校对文献引用,每一步都充满不小的…...
游戏开发新思路:用SDF实现超低开销的软阴影与AO(以Bunny模型为例)
游戏开发新思路:用SDF实现超低开销的软阴影与AO(以Bunny模型为例) 在独立游戏开发中,画面表现与性能开销往往难以兼得。传统阴影和环境光遮蔽(AO)方案如Shadow Map和SSAO虽然效果尚可,但对硬件资…...
实战【支付宝】账单PDF解析:从数据提取到风控建模的Python自动化流程
1. 为什么需要解析支付宝账单PDF? 在金融风控领域,贷后审核是一个至关重要的环节。审核人员需要根据用户提供的账单流水,准确评估用户的还款能力。而支付宝作为国内主流的支付平台,其账单数据往往能真实反映用户的收支情况。但实…...
爬虫登录状态保持实战:用Session和Cookies搞定需要登录的网站(以B站为例)
爬虫登录状态保持实战:用Session和Cookies搞定需要登录的网站(以B站为例) 当你想要爬取B站个人收藏夹、微博私信或者任何需要登录才能访问的数据时,如何保持登录状态就成了一个必须解决的问题。这就像你要进入一个会员制俱乐部&am…...
零成本实现一台电脑多人分屏游戏:Nucleus Co-Op终极指南
零成本实现一台电脑多人分屏游戏:Nucleus Co-Op终极指南 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 还在为朋友聚会时电脑不够用而…...
智能体的商业化困境
随着AI技术从“大模型狂欢”迈入“智能体争艳”的新阶段,智能体被寄予厚望,成为连接大模型能力与产业需求、实现技术商业化变现的核心载体。然而现实中,多数智能体项目停留在POC(概念验证)阶段,难以实现规模…...
解放双手的终极指南:如何用MAA自动化助手轻松管理《明日方舟》日常任务
解放双手的终极指南:如何用MAA自动化助手轻松管理《明日方舟》日常任务 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地…...
CefFlashBrowser:解决Flash内容访问与存档管理的完整解决方案
CefFlashBrowser:解决Flash内容访问与存档管理的完整解决方案 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 你是否还在为无法在现代浏览器中运行经典Flash游戏而烦恼&#x…...
