引言
在 C++ 的多线程编程世界里,std::packaged_task 是一个功能强大却容易被忽视的工具。它就像是一个智能的任务容器,能够将可调用对象(如函数、函数对象、lambda 表达式等)包装起来,并且可以异步地执行这些任务,同时还能与 std::future 配合,方便地获取任务的执行结果。接下来,我们将深入了解 std::packaged_task 的特性、使用场景,并通过一个具体的示例来展示它在实际项目中的应用。
std::packaged_task 简介
基本概念
std::packaged_task 是 C++ 标准库 <future> 头文件中的一个模板类,它的主要作用是将一个可调用对象包装成一个任务,这个任务可以被异步执行。它将任务的执行和结果的获取分离开来,使得我们可以在不同的线程中处理这两个过程。
主要特点
- 可调用对象的包装:
std::packaged_task可以接受各种可调用对象,包括普通函数、成员函数、函数对象和 lambda 表达式等。通过模板参数指定可调用对象的返回类型和参数列表,将其包装成一个任务。 - 异步执行:可以将包装好的任务传递给线程或其他异步执行机制,让任务在后台线程中执行,从而实现异步操作。
- 结果获取:
std::packaged_task关联一个std::future对象,当任务执行完成后,其结果会被存储在std::future中,我们可以通过std::future的get()方法获取任务的返回值。
简单示例
#include <iostream>
#include <future>
// 一个简单的可调用函数
int add(int a, int b) {
return a + b;
}
int main() {
// 创建一个 packaged_task 对象,包装 add 函数
std::packaged_task<int(int, int)> task(add);
// 获取与 packaged_task 关联的 future 对象
std::future<int> future = task.get_future();
// 执行任务
task(3, 4);
// 获取任务的结果
int result = future.get();
std::cout << "The result is: " << result << std::endl;
re

最低0.47元/天 解锁文章
889

被折叠的 条评论
为什么被折叠?



