在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
函數中,我們分別等待兩個異步任務完成,并打印結果。通過這種方式,我們可以實現異步操作的組合。