阅读量:0
在C++中,可以使用协程和future/promise来实现异步操作的组合。下面是一个简单的示例代码,演示如何使用await关键字来等待异步操作完成:
#include <iostream> #include <future> #include <experimental/coroutine> std::future<int> async_task() { // 模拟一个异步操作,等待1秒 std::this_thread::sleep_for(std::chrono::seconds(1)); return std::async([]() { return 42; }); } std::future<int> async_task2() { // 模拟另一个异步操作,等待2秒 std::this_thread::sleep_for(std::chrono::seconds(2)); return std::async([]() { return 100; }); } auto operator co_await(std::future<int>&& f) { struct awaiter { std::future<int> f; bool await_ready() { return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; } int await_resume() { return f.get(); } void await_suspend(std::experimental::coroutine_handle<> handle) { f.then([handle = std::move(handle)](std::future<int> f) { handle.resume(); }); } }; return awaiter{std::move(f)}; } int main() { auto result1 = async_task(); auto result2 = async_task2(); int value1 = co_await result1; int value2 = co_await result2; std::cout << "Result 1: " << value1 << std::endl; std::cout << "Result 2: " << value2 << std::endl; return 0; }
在上面的代码中,我们定义了两个异步任务async_task
和async_task2
,然后定义了协程的await操作符重载函数co_await
,通过该操作符实现等待异步任务的完成。在main
函数中,我们分别等待两个异步任务完成,并打印结果。通过这种方式,我们可以实现异步操作的组合。