C++ 标准库 <future>
C++ 标准库
C++11 引入了
std::future:表示异步操作的结果,可以查询操作的状态,获取结果或等待操作完成。
std::promise:用于与 std::future 配对,用于设置异步操作的结果。
std::packaged_task:封装一个函数或可调用对象,使其可以作为异步任务执行。
std::promise
std::promise 用于设置异步操作的结果。它与 std::future 配对使用。
实例
#include
#include
int main() {
std::promise
std::future
// 在另一个线程中设置结果
std::thread t(prom {
prom.set_value(10);
});
// 等待结果
std::cout << “Future value: “ << fut.get() << std::endl;
t.join();
return 0;
}
输出结果:
Future value: 10
std::packaged_task
std::packaged_task 封装一个函数或可调用对象,使其可以作为异步任务执行。
实例
#include
#include
#include
int compute_square_root(double x) {
return std::sqrt(x);
}
int main() {
std::packaged_task<double(double)> task(compute_square_root);
std::future
std::thread th(std::move(task), 9.0);
std::cout << “Result: “ << result.get() << std::endl;
th.join();
return 0;
}
输出结果:
Result: 3
std::async
std::async 是一个方便的函数,用于启动异步任务。它可以立即返回一个 std::future 对象。
实例
#include
#include
int main() {
std::future
return x * x;
}, 5);
std::cout << “Result: “ << fut.get() << std::endl;
return 0;
}
输出结果:
Result: 25
异常处理
当异步操作抛出异常时,std::future 会捕获这个异常,并且可以通过调用 .get() 方法来重新抛出它。
实例
#include
#include
void throw_exception() {
throw std::runtime_error(“Exception thrown”);
}
int main() {
std::future
try {
fut.get();
} catch (const std::exception& e) {
std::cout << “Caught exception: “ << e.what() << std::endl;
}
return 0;
}
输出结果:
Caught exception: Exception thrown