57.C++多线程_异步
约 450 字大约 2 分钟
std::async、 std::future、 std::promise
特性 std::async std::promise std::packaged_task
适用场景 后台执行任务 手动传递结果 封装任务对象
自动启动 ✅ 是 ❌ 否(需手动管理线程) ❌ 否(需手动启动)
是否阻塞 ❌ 否(除非 get() 被调用) ❌ 否(异步传递结果) ❌ 否(任务对象可延迟执行)
适用于 简单异步计算 手动管理线程通信 任务队列、线程池
std::async 异步任务
#include <iostream>
#include <future>
#include <chrono>
int compute() {
std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时任务
return 42;
}
int main() {
std::future<int> result = std::async(std::launch::async, compute);
std::cout << "主线程继续执行...\n";
int value = result.get(); // 获取结果(阻塞等待)
std::cout << "异步任务结果:" << value << std::endl;
return 0;
}
std::future + std::promise(手动控制异步)
#include <iostream>
#include <thread>
#include <future>
void compute(std::promise<int> p) {
std::this_thread::sleep_for(std::chrono::seconds(2));
p.set_value(100); // 计算完成,返回结果
}
int main() {
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t(compute, std::move(p));
std::cout << "主线程继续执行...\n";
int value = f.get(); // 等待并获取结果
std::cout << "异步任务结果:" << value << std::endl;
t.join();
return 0;
}
std::packaged_task(将函数封装成异步任务)
#include <iostream>
#include <future>
#include <thread>
int compute(int x) {
std::this_thread::sleep_for(std::chrono::seconds(2));
return x * 2;
}
int main() {
std::packaged_task<int(int)> task(compute);
std::future<int> result = task.get_future();
std::thread t(std::move(task), 10);
std::cout << "主线程继续执行...\n";
int value = result.get();
std::cout << "计算结果:" << value << std::endl;
t.join();
return 0;
}
std::future::wait_for()(超时等待)
#include <iostream>
#include <future>
#include <chrono>
int compute() {
std::this_thread::sleep_for(std::chrono::seconds(5));
return 42;
}
int main() {
std::future<int> result = std::async(std::launch::async, compute);
std::cout << "等待任务完成(最多 3 秒)...\n";
if (result.wait_for(std::chrono::seconds(3)) == std::future_status::ready) {
std::cout << "计算结果:" << result.get() << std::endl;
} else {
std::cout << "任务超时!\n";
}
return 0;
}