下面是一个使用promise_type进行空协同测试的代码片段
#include <iostream>
#include <coroutine>
#define DEBUG std::cout << __PRETTY_FUNCTION__ << std::endl
struct TaskSuspendAll {
// must be of this name
struct promise_type {
TaskSuspendAll get_return_object() noexcept {
return TaskSuspendAll{
std::coroutine_handle<promise_type>::from_promise(*this)
};
}
std::suspend_always initial_suspend() noexcept {
DEBUG;
return {};
}
std::suspend_always final_suspend() noexcept {
DEBUG;
return {};
}
void unhandled_exception() {}
void return_void() {
DEBUG;
}
};
std::coroutine_handle<promise_type> ch;
};
TaskSuspendAll TestSuspendAll() {
DEBUG;
co_return;
}
int main() {
std::cout << std::endl;
auto t = TestSuspendAll();
t.ch.resume();
//t.ch.resume()
//t.ch.destroy();
return 0;
}运行这个,我得到
std::__n4861::suspend_always TaskSuspendAll::promise_type::initial_suspend()
TaskSuspendAll TestSuspendAll()
void TaskSuspendAll::promise_type::return_void()
std::__n4861::suspend_always TaskSuspendAll::promise_type::final_suspend()我的理解是,co_await适用于initial_suspend和final_suspend。当我在TestSuspendAll函数中调用main时,它最终会调用co_await promise.initial_suspend()并返回给调用者,因为我拥有std::suspend_always。然后我恢复协同线然后身体被处死。在某个时候,我们将有co_await promise.final_suspend(),并再次返回给调用者。
问:我希望我必须进行第二次调用才能恢复协同,这样co_await promise.final_suspend()就成功了,coroutine也完成了。然而,这会导致赛格断层。我知道这是在已完成的协同中调用简历的未定义行为,但据我所知,它还没有100%完成。我的期望是final_suspend的行为和initial_suspend一样.这里的逻辑是什么?我们必须在调用final_suspend后使用破坏
非常感谢你的澄清!
VK
发布于 2021-12-31 23:11:53
在其最后的暂停点被暂停是所做的协同线的定义。字面上;返回.试图恢复这样的合作是UB。
所以你的期望是不正确的。
https://stackoverflow.com/questions/70545944
复制相似问题