于打包任务(如可调用对象、函数、lambda表达式、bind表达式或者其他函数对象),以便异步地执行它,并获取其结果。它与std::future和std::prom
时间: 2024-10-10 14:13:08 浏览: 40
C++ function、bind以及lamda表达式
在C++中,`std::packaged_task`是一种用于封装可调用对象并异步执行的工具,它结合了`std::function`的功能(用于存储可调用的对象)和`std::future`的功能(用于处理异步操作的结果)。当你有一个需要延迟执行的任务,你可以将这个任务包装进`packaged_task`,然后创建一个`future`来跟踪它的完成。
举个例子:
```cpp
#include <iostream>
#include <future>
#include <thread>
// 定义一个可调用对象
int add(int a, int b) {
return a + b;
}
int main() {
// 创建一个packaged_task,传递add函数作为参数
std::packaged_task<int(int, int)> task(add);
// 开始异步执行任务
auto future = task.get_future();
// 在另一个线程中执行任务
std::thread worker([task]() { task(); });
// 主线程继续执行其他任务
std::cout << "主线程开始做其他事情...\n";
// 等待任务完成
worker.join();
// 获取并打印结果
try {
int result = future.get();
std::cout << "结果是: " << result << '\n';
} catch (std::exception& e) {
std::cerr << "捕获到异常: " << e.what() << '\n';
}
return 0;
}
```
在这个示例中,`worker`线程负责执行`task`,而主线程则可以继续执行其他任务。当`worker`完成时,我们通过`future.get()`来获取异步计算的结果。
阅读全文