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 是一种将可调用对象(如函数、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 到线程中执行,避免捕获问题。
使用 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 的线程。
以上就是c++++如何使用std::packaged_task封装异步任务_c++获取异步任务的返回值的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1486935.html
微信扫一扫
支付宝扫一扫