C++11异步与通信之 packaged_task
概念简介
packaged_task
用于包装可调用目标(Callable)为一个对象,如lambda,普通函数,小括号重载等,用于异步调用。
其返回值或所抛异常被存储于能通过 std::future 对象访问的共享状态中,和promise类似。
将函数的调用与函数返回值的获取分开调用,这样就给异步提供很大的便利。
猛的一看好像和std::bind
绑定器作用相似,可惜std::bind
返回的对象是同步的。
示例:函数在子线程执行,返回值可以在主线程异步获取
std::string Func()
{std::cout << "Thread t Call Func"<< std::endl;std::this_thread::sleep_for(std::chrono::seconds(2));return "Return Thread t Func Result";
}int main()
{//将全局函数Func打包成异步调用对象std::packaged_task<std::string()> task(Func);//task调用后的结果将保存在result中//result的类型是std::future<std::string> ,即函数返回值的类型auto result = task.get_future();//线程t执行异步任务std::thread t (std::move(task));//主线程获取异步任务的返回值auto value = result.get();//打印结果std::cout << "Main Thread Get Return value = " << value << std::endl;t.join();return 0;
}
执行结果:
Thread t Call Func
Main Thread Get Return value = Return Thread t Func Result
补充:
有一些任务执行可能比较耗时,我们可以使用其提供的带时间的结果获取
- std::future_status::timeout 异步任务已经完成并返回结果。此时可以通过调用
std::future::get()
来获取异步任务的返回值; - std::future_status::ready 等待异步任务超时。此时可以选择等待更长时间再尝试获取结果,或者取消任务;
- std::future_status::deferred 异步任务被推迟执行。此时可以暂时不获取结果,等待后续需要时再执行异步任务,或者放弃执行异步任务。利用
std::future::deferred
策略将异步任务推迟到std::future::get()
方法调用时才执行,从而实现惰性求值。这种方式下,异步任务的执行被推迟,直到调用std::future::get()
方法时再执行。返回该状态意味着异步任务还未执行,并且只有调用std::future::get()
时才会执行。
if(result.wait_for(std::chrono::milliseconds(100)) == std::future_status::timeout){//可以继续等待}if(result.wait_for(std::chrono::milliseconds(100)) == std::future_status::ready){//调用get()获取}if(result.wait_for(std::chrono::milliseconds(100)) == std::future_status::deferred){//调用get()获取}
相关文章:
C++11异步与通信之 packaged_task
概念简介 packaged_task 用于包装可调用目标(Callable)为一个对象,如lambda,普通函数,小括号重载等,用于异步调用。 其返回值或所抛异常被存储于能通过 std::future 对象访问的共享状态中,和promise类似。 将函数的调用与函数返…...

磁盘的管理
一、磁盘的分区 查看磁盘 lsblk fdisk -l 2、分区 没有e扩展,则都是主分区,已经有三个主分区了,剩下的全设置为扩展 查看分区结果: 二、格式化 三、挂载...
数据结构:完全二叉树的性质
完全二叉树的性质: 具有 n n n个结点的完全二叉树的深度为 [ l o g 2 n ] 1 ( [ x ] 表示不大于 x 的最大整数 ) [log_2n]1([x]表示不大于x的最大整数) [log2n]1([x]表示不大于x的最大整数) 对于任意一个结点 ( 1 < i < n ) &…...

【数据结构】‘双向链表’冲冲冲
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

Linux 编译CEF源码详细记录
Linux CEF(Chromium Embedded Framework)源码下载编译 背景 由于CEF默认的二进制分发包不支持音视频播放,需要自行编译源码,将ffmpeg开关打开才能支持。这里介绍的是Linux平台下的CEF源码下载编译过程。 Windows平台参考&#…...
LeetCode 2810. Faulty Keyboard【模拟,双端队列,字符串】简单
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

两个数组的交集-C语言/Java
描述 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。(1 < nums1.length, nums2.length < 1000,0 < nums1[i], nums2[i] < 1000) 示例1 输入…...

Arduino+esp32学习笔记
学习目标: 使用Arduino配置好蓝牙或者wifi模块 学习使用python配置好蓝牙或者wifi模块 学习内容(笔记): 一、 Arduino语法基础 Arduino语法是基于C的语法,C又是c基础上增加了面向对象思想等进阶语言。那就只记录没见过的。 单多…...

计算机网络-专业术语
计算机网络-专业术语 实体 实体:任何可发送或接收信息的硬件或软件进程 对等实体:收发双方相同层次中的实体 协议 控制两个对等实体进行逻辑通信的规则的集合 协议三要素 语法 定义所交换的信息的格式 是用户数据与控制信息的结构和格式 语义 定义收发双方所需要完成的操作…...
E. Maximum Monogonosity
You are given an array aa of length nn and an array bb of length nn. The cost of a segment [l,r][l,r], 1≤l≤r≤n1≤l≤r≤n, is defined as |bl−ar||br−al||bl−ar||br−al|. Recall that two segments [l1,r1][l1,r1], 1≤l1≤r1≤n1≤l1≤r1≤n, and [l2,r2][l2,…...
已解决Excel file format cannot be determined, you must specify an engine manually
问题 我使用以下语句时出现错误 data pd.read_excel(temp_inputc.csv, headerNone)出现错误: Excel file format cannot be determined, you must specify an engine manually有很多人说添加engine,但接下来会出现这个错误: File is not…...
Centos yum命令大全
1.使用YUM查找软件包 $ yum search python 2.列出所有可安装的软件包 $ yum list | grep python 3.列出所有可更新的软件包 $ yum list updates 4.列出所有已安装的软件包 $ yum list installed | grep python...

内网横向移动—ARP攻击图片捕捉数据劫持DNS劫持
内网横向移动—ARP攻击&图片捕捉&数据劫持&DNS劫持 1. ARP1.1. APR介绍1.1.1. ARP工作原理1.1.2. APR欺骗工作原理 1.2. 环境准备1.3. 适用场景 2. ARP断网攻击演示2.1. 使用kali进行演示2.1.1. nmap判断存活2.1.2. 安装工具2.1.3. 攻击Windows 10虚拟机2.1.3.1. 查…...
react之Hooks的介绍、useState与useEffect副作用的使用
react之Hooks的介绍、useState与useEffect副作用的使用 一、Hooks的基本介绍二、useState的使用2.1 简单使用2.2 数组结构简化2.3 状态的读取和修改2.3 组件的更新过程 三、useEffect的使用3.1 副作用介绍3.2 基本使用3.3 依赖3.4 不要对依赖项撒谎3.5 依赖项可以是空数组3.6 清…...

django——创建 Django 项目和 APP
2.创建 Django 项目和 APP 命令: 创建Django项目 django-admin startproject name 创建子应用 python manager.py startapp name 2.1 创建工程 在使用Flask框架时,项目工程目录的组织与创建是需要我们自己手动创建完成的。 在django中,…...
== 和 equals 的对比 [面试题]
和 equals 的对比[面试题] 文章目录 和 equals 的对比[面试题]1. 和 equals 简介2. Object 类中 equals() 源码3. String 类中 equals() 源码4. Integer 类中 equals() 源码5. 如何重写 equals 方法 1. 和 equals 简介 是一个比较运算符 :既可以判断基本数据类型…...

SpringBoot集成Redis及Redis使用方法
目录 应用背景 Redis简介 更新问题 一:环境配置 1.1: 在pom.xml文件中添加依赖 1.2:配置SpringBoot核心配置文件application.properties 二:在Config文件夹中创建RedisConfig配置文件类 2.1:RedisTemplate中的几个角色&am…...
Redis可以用作数据库吗?它的适用场景是什么?
是的,Redis可以用作数据库。虽然Redis通常被认为是一个内存数据库(in-memory database),但它也可以通过持久化机制将数据保存在磁盘上,以便在重启后恢复数据。 Redis的适用场景包括但不限于以下几个方面: …...

@Param详解
文章目录 背景什么是ParamParam的使用方法使用方法:遇到的问题及因Param解决了什么问题使用与不使用对比 Param是如何进行映射的总结 背景 最近在开发过程中,在写mapper接口是在参数前加了Param注解,但是在运行的时候就会报错,说…...
自定义分页工具类
前言 在日常的开发工作中,会遇到很多不确定的需求场景,无法使用第三方提供的分页组件来实现,那么如何自己实现一个简单的分页工具类呢? 工具类 第一版本: Setter Getter public class PageTool<T> {/*** 当前…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础
在构建任何动态、数据驱动的Web API时,一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说,深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言,以及学会如何在Python中操作数据库,是…...

Centos 7 服务器部署多网站
一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站,目录结构如下: bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...