阅读量:0
在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
对象。