这是一个创建于 1172 天前的主题,其中的信息可能已经有所发展或是发生改变。
#include <coroutine>
#include <iostream>
#include <thread>
#include <cassert>
struct Awaiter {
typedef std::coroutine_handle<> CoRoutine;
Awaiter() {}
bool await_ready() {
std::cout << "await ready or not" << std::endl;
return false;
}
auto await_resume() {
std::cout << "await resumed" << std::endl;
return 10086;
}
void await_suspend(std::coroutine_handle<> h) {
std::cout << "await suspended" << std::endl;
printf("h=%p\n", &h);
std::thread([h]()
{
for (size_t i = 0; i < 2; i++)
{
std::this_thread::sleep_for(std::chrono::milliseconds(500));
putc('.', stdout);
}
puts("R");
h.resume();
}).detach();
}
};
template <class T>
struct Task {
struct promise_type {
auto get_return_object() noexcept {
std::cout << "get return object" << std::endl;
return Task<T>();
}
auto initial_suspend() noexcept {
std::cout << "initial suspend, return never" << std::endl;
return std::suspend_never{};
}
auto final_suspend() noexcept {
std::cout << "final suspend, return never" << std::endl;
return std::suspend_never{};
}
void unhandled_exception() {
std::cout << "unhandle exception" << std::endl;
std::terminate();
}
void return_value(int val) {
std::cout << "return value\n";
}
};
};
template <>
struct Task<void> {
struct promise_type {
auto get_return_object() noexcept {
std::cout << "get return object" << std::endl;
return Task<void>();
}
auto initial_suspend() noexcept {
std::cout << "initial suspend, return never" << std::endl;
return std::suspend_never{};
}
auto final_suspend() noexcept {
std::cout << "final suspend, return never" << std::endl;
return std::suspend_never{};
}
void unhandled_exception() {
std::cout << "unhandle exception" << std::endl;
std::terminate();
}
void return_void() {
std::cout << "return void" << std::endl;
return;
}
};
};
Task<void> CoroutineFunc() {
std::cout << "before co_await" << std::endl;
for (int i = 0; i < 3; i++)
auto xx = co_await Awaiter();
std::cout << "after co_await" << std::endl;
}
int main() {
std::cout << "main() start" << std::endl;
auto co = CoroutineFunc();
auto h = std::coroutine_handle<decltype(co)>::from_promise(co);
assert(&h.promise() == &co);
while (!h.done())
{
putc('*', stdout);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
h.destroy();
std::cout << "main() exit" << std::endl;
}
2 条回复 • 2021-11-30 14:53:30 +08:00
![ysc3839](https://cdn.v2ex.com/avatar/c307/29ad/27712_normal.png?m=1682522765) |
|
1
ysc3839 2021-11-30 13:31:08 +08:00 via Android
等不到“done” 指的是什么呢?
|
![mz02005](https://cdn.v2ex.com/gravatar/96244617e6f5619bf202356dcf0f0147?s=48&d=retro) |
|
2
mz02005 2021-11-30 14:53:30 +08:00
@ ysc3839 就是 while(!h.done())这句条件总是成立
|