0

0

c++如何使用std::packaged_task封装异步任务_c++获取异步任务的返回值

尼克

尼克

发布时间:2025-11-30 05:15:22

|

332人浏览过

|

来源于php中文网

原创

std::packaged_task 可将函数、lambda 等可调用对象包装为异步任务,通过 get_future() 获取 future 以获取返回值或异常;1. 创建 std::packaged_task 并传入函数 compute;2. 调用 get_future() 获取 future 对象;3. 将 task 移入新线程执行;4. 主线程调用 result.get() 获取结果;支持带参函数,在线程中调用 task(3,7) 传参;可用 lambda 内联复杂逻辑;若任务抛异常,future::get() 会重新抛出,便于统一错误处理。

c++如何使用std::packaged_task封装异步任务_c++获取异步任务的返回值

在C++中,std::packaged_task 是一种将可调用对象(如函数、lambda表达式等)包装成异步任务的机制,它与 std::future 配合使用,可以方便地获取异步任务的返回值。这种机制适用于需要在后台执行任务并后续获取结果的场景。

std::packaged_task 的基本用法

std::packaged_task 模板参数是函数的签名,例如 int() 表示一个无参、返回 int 的函数。构造时传入具体的可调用对象,之后可以通过 get_future() 获取一个 future 对象,用于将来获取任务的返回值。

示例代码:

#include 
#include 
#include 

int compute() {
    return 42;
}

int main() {
    std::packaged_task task(compute);
    std::future result = task.get_future();

    std::thread t(std::move(task));
    t.join();

    std::cout << "Result: " << result.get() << std::endl; // 输出 42
    return 0;
}

说明:

立即学习C++免费学习笔记(深入)”;

  • 创建一个封装了 compute 函数的 packaged_task
  • 通过 get_future() 获取关联的 future
  • 将 task 移动到新线程中执行
  • 主线程调用 result.get() 等待结果并获取返回值

传递带参数的函数

如果任务函数有参数,可以在调用 task 时传入。注意:task 本身不支持直接绑定参数,需在调用 operator() 时提供。

#include 
#include 
#include 

int add(int a, int b) {
    return a + b;
}

int main() {
    std::packaged_task task(add);
    std::future result = task.get_future();

    std::thread t([&task]() {
        task(3, 7); // 在线程中调用,传入参数
    });

    t.join();
    std::cout << "Add result: " << result.get() << std::endl; // 输出 10
    return 0;
}

注意:lambda 捕获 task 时要确保生命周期安全。也可以直接移动 task 到线程中执行,避免捕获问题。

BlackBox AI
BlackBox AI

AI编程助手,智能对话问答助手

下载

使用 lambda 表达式作为任务

更常见的做法是用 lambda 包装逻辑,便于内联定义复杂操作。

std::packaged_task task([]() {
    double sum = 0.0;
    for (int i = 1; i <= 1000000; ++i) {
        sum += 1.0 / i;
    }
    return sum;
});
std::future fut = task.get_future();
std::thread t(std::move(task));
t.join();
double value = fut.get();
std::cout << "Computed sum: " << value << std::endl;

这种方式适合封装局部计算逻辑,无需单独定义函数。

异常处理与结果获取

如果任务抛出异常,异常会被捕获并存储,调用 future::get() 时会重新抛出。

std::packaged_task task([](){
    throw std::runtime_error("Something went wrong");
});
std::future fut = task.get_future();
std::thread t(std::move(task));
t.join();

try {
    fut.get(); // 这里会抛出异常
} catch (const std::exception& e) {
    std::cout << "Exception: " << e.what() << std::endl;
}

这样可以统一在主线程或其他上下文中处理异步任务中的错误。

基本上就这些。std::packaged_task 提供了一种灵活的方式将任意可调用对象转为可异步执行的任务,并通过 future 安全获取返回值或异常。结合线程使用时注意资源管理和生命周期,避免悬挂引用或未 join 的线程。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

537

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

47

2026.01.05

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号