【发布时间】:2021-11-25 00:18:28
【问题描述】:
看看这个简化的例子:
std::coroutine_handle<> logger;
const char* next_msg = nullptr;
void log(const char* msg)
{
next_msg = msg;
if (logger) logger.resume();
}
struct wait_msg {
bool await_ready() {
return next_msg != nullptr;
}
void await_suspend(std::coroutine_handle<> h) {
logger = h;
}
auto await_resume() {
const char* msg = next_msg;
next_msg = nullptr;
return msg;
}
};
struct procedure {
struct promise_type;
using handle_type = std::coroutine_handle<promise_type>;
handle_type handle;
struct promise_type {
procedure get_return_object() {
return { handle_type::from_promise(*this)};
}
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
};
procedure log_messages()
{
int c = 1;
for (;;) {
const char* msg = co_await wait_msg{};
std::cout << c++ << ": " << msg << std::endl;
}
}
假设我在初始或最终点没有暂停,并且协程在 co_await 上暂停,协程句柄是否应该在程序结束之前销毁?
或者:p.handle.destroy(); 行可以从main 中删除吗?
int main() {
log("Hello World!");
auto p = log_messages();
log("Hello World, again!");
log("Hello World, and again!");
// is the next line needed?
p.handle.destroy();
}
查看完整的demo。
有问题的代码的先前版本here。
【问题讨论】:
标签: c++ destructor c++20 coroutine