在C++中,then通常与异步编程和std::future或std::promise一起使用
std::async创建异步任务:auto future = std::async(std::launch::async, []() {
// 异步任务代码
return 42;
});
std::future::then链接多个异步任务:auto future = std::async(std::launch::async, []() {
// 第一个异步任务代码
return 42;
}).then([](std::future<int> f) {
int result = f.get(); // 获取第一个任务的结果
// 第二个异步任务代码
return result * 2;
});
std::shared_future来共享结果:std::shared_future<int> shared_future = std::async(std::launch::async, []() {
// 异步任务代码
return 42;
});
// 在其他地方使用shared_future.get()获取结果
std::promise和std::future手动管理异步任务:std::promise<int> promise;
std::future<int> future = promise.get_future();
std::thread([&promise]() {
// 异步任务代码
promise.set_value(42);
}).detach();
// 在主线程中获取结果
int result = future.get();
注意事项:
std::future::get()之前检查std::future是否已经完成(is_ready()),以避免阻塞。std::future::then时,请确保在链式调用中正确处理异常。可以使用std::future::exception()检查是否有异常,并使用std::future::get()重新抛出异常。std::shared_future时,请确保在所有引用该std::shared_future的对象之间正确同步访问。std::promise和std::future手动管理异步任务时,请确保在任务完成后调用std::promise::set_value()或std::promise::set_exception(),以避免死锁。std::future时,请确保正确处理生命周期和资源管理。例如,不要在异步任务完成之前销毁std::promise或std::future对象。