std::async与std::future用于异步任务执行和结果获取,通过get()获取返回值或异常,支持async和deferred启动策略,需注意调用get()避免阻塞析构。

在C++11中,std::async 和 std::future 提供了一种简单的方式来执行异步任务并获取其结果。它们位于 red"><future> 头文件中,是标准库对多线程编程的高层封装,适合不需要手动管理线程的场景。
std::async 是一个函数模板,用于启动一个异步任务(可以是函数、lambda表达式等),它会返回一个 std::future 对象。这个 future 可以用来在将来某个时间点获取任务的返回值。
std::future 就像一个“占位符”,代表一个尚未完成的计算结果。你可以通过调用它的 get() 方法来等待结果并取出值。
下面是一个简单的例子,展示如何使用 std::async 执行一个耗时操作,并通过 std::future 获取结果:
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <future>
#include <thread>
#include <chrono>
int slow_calculation() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return 42;
}
int main() {
// 启动异步任务
std::future<int> fut = std::async(slow_calculation);
std::cout << "正在执行其他操作...\n";
// 等待结果并获取
int result = fut.get(); // 阻塞直到结果可用
std::cout << "结果是: " << result << "\n";
return 0;
}
在这个例子中,slow_calculation 函数在后台运行,主线程可以继续做其他事情,直到调用 fut.get() 时才阻塞等待结果。
std::async 支持两种启动策略:
你可以显式指定策略:
auto fut1 = std::async(std::launch::async, slow_calculation); // 异步执行 auto fut2 = std::async(std::launch::deferred, slow_calculation); // 延迟执行 auto fut3 = std::async(std::launch::async | std::launch::deferred, slow_calculation); // 让系统决定
如果不指定,默认行为由系统决定(通常是可异步就异步)。
如果异步任务抛出异常,这个异常会被捕获并存储在 future 中,当你调用 get() 时,异常会重新抛出。
你也可以使用 wait_for 或 wait_until 来避免长时间阻塞:
std::future<int> fut = std::async([]{
std::this_thread::sleep_for(std::chrono::seconds(3));
return 100;
});
// 等待最多1秒
auto status = fut.wait_for(std::chrono::seconds(1));
if (status == std::future_status::ready) {
std::cout << "结果: " << fut.get() << "\n";
} else {
std::cout << "任务还没完成\n";
}
可用的状态包括:
不要忘记调用 get() 或 wait(),否则当 future 析构时,如果它是从 std::launch::async 启动的,程序可能会阻塞等待任务完成。
每个 future 只能调用一次 get(),多次调用会导致未定义行为。
基本上就这些。std::async 和 std::future 让异步编程变得直观且安全,特别适合一次性任务的结果获取。不复杂但容易忽略细节,比如启动策略和异常传递。合理使用,能有效提升程序响应性。
以上就是c++++怎么用std::async和std::future进行异步编程_c++ std::async与std::future使用方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号