写一个完整的co_await 例子
时间: 2023-02-20 17:36:30 浏览: 64
下面是一个 `co_await` 的完整示例:
```
#include <iostream>
#include <chrono>
#include <experimental/coroutine>
struct SleepyTask {
struct promise_type {
SleepyTask get_return_object() { return {}; }
std::experimental::suspend_never initial_suspend() { return {}; }
std::experimental::suspend_never final_suspend() { return {}; }
void return_void() {}
};
void operator()(int milliseconds) {
std::cout << "Sleeping for " << milliseconds << " milliseconds...\n";
std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds));
std::cout << "Awake!\n";
}
};
struct async_example {
struct promise_type {
async_example get_return_object() { return {}; }
std::experimental::suspend_always initial_suspend() { return {}; }
std::experimental::suspend_always final_suspend() { return {}; }
void return_void() {}
};
void operator()() {
std::cout << "Starting a long-running task...\n";
co_await SleepyTask{}(1000);
std::cout << "The task is complete.\n";
}
};
int main() {
async_example{}();
std::cout << "Returned from the coroutine.\n";
}
```
该示例定义了两个结构体:`SleepyTask` 和 `async_example`。`SleepyTask` 是一个模拟任务,它在睡眠指定的毫秒数后输出“唤醒!”。`async_example` 是一个异步示例,它启动了一个长时间运行的任务,并在睡眠 1 秒后输出“任务完成”。
在 `main` 函数中,我们创建了一个 `async_example` 对象并调用它,这将启动一个协程。当协程中的任务完成后,它将输出“返回协程”。
该代码使用 C++ 20 的协程功能,使用 `co_await` 关键字暂停