我有一个非常简单的协程示例来了解基础知识。然而,我一直不明白为什么句柄对象的done方法仍然返回false。我打电话给resume,但没有更多的co_await了。 我在这里缺少什么?
#include <coroutine>
#include <iostream>
struct ReturnObject {
struct promise_type {
ReturnObject get_return_object() {
return {std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_never initial_suspend() noexcept { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void unhandled_exception() {}
void return_void() noexcept {}
};
ReturnObject(std::coroutine_handle<> h) : h_{h}{ }
std::coroutine_handle<> h_;
};
ReturnObject foo() {
std::cout << "1. Hello World!\n";
co_await std::suspend_always{};
std::cout << "2. Hello World!\n";
}
int main(int argc, char** argv) {
ReturnObject ret_object = foo();
ret_object.h_();
std::cout << ret_object.h_.done() << std::endl;
return 0;
}
我调用resume,虽然不再有co_await,但是done方法仍然返回false
done
仅为代表挂起协程的协程句柄定义。如果所表示的协程在其最终暂停点暂停,它将返回 true,否则返回 false。
您的测试协程完成并且最终的暂停点不会暂停。这意味着协程会立即被清理并释放任何状态。所以你的协程句柄不再代表一个协程,它消失了。
让final_suspend返回suspend_always,你就会看到你所期望的。但是你必须在协程句柄上调用 destroy ,否则你会泄漏它。