std::packaged_task返回类型(参数类型)

news/2024/10/7 12:08:41/文章来源:https://www.cnblogs.com/niumachen/p/18449883

std::packaged_task 概述

std::packaged_task 是 C++11 引入的标准库模板类,用于包装一个可调用对象(如函数、lambda 表达式、函数对象等),使其能够与 std::future 协同工作

简单来说,它将一个任务(可调用对象)包装起来,并允许你获取该任务的执行结果,这样你可以在一个线程中执行任务,并在另一个线程中获取其结果。

std::packaged_taskstd::futurestd::promise 一起,提供了异步任务执行和结果传递的功能。

基本功能

  • 包装可调用对象:通过 std::packaged_task 包装一个函数或可调用对象,类似于把任务“打包”起来。
  • 异步执行任务:将 packaged_task 对象交由线程执行,异步地处理任务。
  • 获取任务结果:通过关联的 std::future 对象,获取异步任务的结果。

用法和示例

1. 基本用法

下面是一个使用 std::packaged_task 包装函数并在不同线程中执行任务的简单示例:

#include <iostream>
#include <future>
#include <thread>
#include <chrono>// 一个简单的函数,用于计算整数平方
int square(int x) {std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作return x * x;
}int main() {// 创建一个 std::packaged_task,包装 square 函数std::packaged_task<int(int)> task(square);// 获取关联的 std::future 对象,用于获取任务结果std::future<int> result = task.get_future();// 将任务交给一个线程异步执行std::thread t(std::move(task), 5); // 传递参数5给square函数t.detach(); // 分离线程// 在主线程中继续做其他事情std::cout << "Doing some work in the main thread..." << std::endl;// 获取任务的返回值,等待任务执行完成std::cout << "The result of square(5) is: " << result.get() << std::endl;return 0;
}

2. 逐步解析:

  1. 创建 packaged_task

    • std::packaged_task<int(int)> task(square); 创建一个 packaged_task,该任务包装了 square 函数,函数的返回值类型为 int,接受一个 int 参数。
  2. 获取 future 对象

    • std::future<int> result = task.get_future(); 获取与 packaged_task 关联的 std::future 对象,未来可以通过该 future 来获取任务的结果。
  3. 异步执行任务

    • std::thread t(std::move(task), 5); 创建一个线程并异步执行任务,传递参数 5square 函数。
  4. 等待结果

    • result.get() 用于获取任务的结果。这会阻塞主线程,直到任务完成并返回值。
  5. 分离线程

    • t.detach(); 分离线程,让任务在后台运行,主线程继续执行。

3. 使用 Lambda 表达式与 std::packaged_task

你可以使用 Lambda 表达式来包装任务:

#include <iostream>
#include <future>
#include <thread>int main() {// 使用 lambda 表达式创建 packaged_taskstd::packaged_task<int(int, int)> task([](int a, int b) {return a + b;});// 获取 future 对象std::future<int> result = task.get_future();// 在新线程中异步执行std::thread t(std::move(task), 10, 20);t.detach();// 等待结果std::cout << "The result is: " << result.get() << std::endl;return 0;
}

在这个例子中,Lambda 表达式 [ ](int a, int b) { return a + b; } 被传递给 packaged_task,并在新线程中执行,主线程通过 result.get() 获取任务的返回值。

std::packaged_task 的常用成员函数

  • get_future()
    获取与 packaged_task 关联的 std::future 对象,用于获取异步任务的结果。

  • operator()
    调用 packaged_task,执行其中的任务。可以通过在新的线程中调用 std::move(task) 来异步执行。

  • 构造函数
    包装一个可调用对象,允许异步调用并获取返回结果。

std::asyncstd::thread 的区别

  • std::packaged_taskstd::future
    std::packaged_taskstd::future 联合使用时,更加灵活,能够包装任意可调用对象并传递给线程或异步任务,用户可以显式控制任务的启动时间。

  • std::async
    std::async 自动将任务放在后台线程中执行,返回 std::future,适合快速执行简单的异步任务,但不如 packaged_task 灵活。

  • std::thread
    std::thread 只是单纯的启动一个线程,无法直接获取线程执行的返回结果。而 std::packaged_task 能与 std::future 结合,使得结果可以通过 future 在主线程中获取。

总结

  • std::packaged_task 用于包装一个可调用对象,使其可以异步执行,并通过 std::future 获取其返回值。
  • std::packaged_task 适合在异步任务管理中灵活控制任务的执行,与 std::futurestd::threadstd::async 配合使用时能够轻松管理异步操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809389.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

张量矩阵乘法分块乘法概述

张量矩阵乘法分块乘法概述 介绍一下矩阵计算相关的内容, 从最基本的算法,到Cutlass这些线性代数模版库, 特别是Layout代数相关的内容,再逐渐细化到一些硬件实现访存优化和一些算子融合。 6.3.1 GEMM概述 1. GEMM定义 对于一个矩阵乘法, 定义如下: (6-1)一个矩阵乘法定义,如…

Java与线程

Java与线程 1. 线程的实现 线程是比进程更轻量级的调度执行单位,线程的引人,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件IO等),又可以独立调度。目前线程是Java里面进行处理器资源调度的最基本单位。 主流的操作系统都提供了线程实…

矩阵分块乘法

矩阵分块乘法 通常可以把一个矩阵分成多个块, 例如, (6-4)可以将其划分为 4个块:(6-5) (6-6)分块后的矩阵记为:(6-7) 分块矩阵乘法如下所示:(6-7)划分不一定需要完全等间隔, 只需要满足子矩阵乘法规则即可, 如图6-27所示。图6-27 子矩阵划分不一定需要完全等间…

从硬件的视角看GEMM

从硬件的视角看GEMM 1. 分块乘法的内存层次架构 分块矩阵乘法,如图6-28所示, 通过将矩阵分块拆分,能够在处理器的Cache和寄存器内存放进行快速计算,计算完成后写回主存。图6-28 分块矩阵乘法 首先,所有的数据都在主内存中,如图6-29所示。图6-29 所有的数据都在主内存中 然…

电表行业强力推荐KY8023S6对标平替BL8023双向继电器驱动芯片

双向继电器驱动芯片KY8023S6对标平替BL8023。 产品特点 SOT23-6L和SOP-8 两种封装 静态功耗电流<1uA 输入高低转换电平为1.3V(Is=1A)左右,兼容多种单片机 工作电压5-40V,推荐工作电压5-30V 输入INA和INB端自带115k下拉电阻,一般可省略外围下拉电阻 集成高速续流二极管,…

重启后,idea 依赖爆红

没改动代码,但无法运行java项目 java: -source 1.5 中不支持……表达式/运算符java: 错误: 不支持发行版本 5解决:https://www.cnblogs.com/liu-han/p/16105953.html 文件→项目结构,SDK和项目/模块 语言级别的版本要一致SDK: 1.8 项目语言级别:SDK默认值 模块语言级别:SD…

[亲测]君临九州+单机安装教程+无需虚拟机+GM后台

今天给大家带来一款单机游戏的架设:君临九州,版本号:1.0.12.30。 另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没…

智慧园区管理系统原型

智慧园区管理系统的构建是一个复杂而系统的工程,它融合了信息化、AI、物联网等多种先进技术,旨在提升园区的管理效率、服务质量以及企业运营效率。 一、明确系统目标和需求 需求收集与分析:首先,需要对园区的实际需求进行全面分析,包括园区类型(如产业园区、办公园区、住…

POI导出excel文件加水印

百分百能用,我用的POI版本是5.2.3,效果如下import lombok.extern.slf4j.Slf4j; import org.apache.poi.openxml4j.opc.PackagePartName; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.openxml4j.opc.TargetMode; import org.apache.poi.xs…

FredNormer: 非平稳时间序列预测的频域正则化方法

时间序列预测是一个具有挑战性的任务,尤其是在处理非平稳数据时。现有的基于正则化的方法虽然在解决分布偏移问题上取得了一定成功但仍存在局限性。这些方法主要在时间域进行操作,可能无法充分捕捉在频域中更明显的动态模式,从而导致次优的结果。 FredNormer论文的研究目的主要…

江苏省第二届数据安全技术应用职业技能竞赛初赛WP

一、数据安全解题赛1、ds_0602解题思路题目让我们获取加密文件中的原始数据,解密后提交第六行第二列数据,下载附件,发现里面有两个文件,其中一个是“.enc”结尾,那这里我们得先简单了解一下“.enc”结尾的是什么类型的文件。简单来说“.enc”结尾的文件通常是经过加密的文…

java之使用CompletableFuture入门2

Java 17 -序章 本文介绍用过的 allOf、anyOf 函数的用法。allOf 函数原型两点: 1、没有返回值。 2、参数 cfs 中 任何一个 都不能是 null。anyOf 函数原型两点: 1、有返回值,为 Object。 2、参数 cfs 中 任何一个 都不能是 null。allOf 测试意图: 多个任务正常执行。ben发布…