coroutine_handle::done 总是返回 false

问题描述 投票:0回答:1

我有一个非常简单的协程示例来了解基础知识。然而,我一直不明白为什么句柄对象的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

c++20 coroutine
1个回答
0
投票

done
仅为代表挂起协程的协程句柄定义。如果所表示的协程在其最终暂停点暂停,它将返回 true,否则返回 false。

您的测试协程完成并且最终的暂停点不会暂停。这意味着协程会立即被清理并释放任何状态。所以你的协程句柄不再代表一个协程,它消失了。

让final_suspend返回suspend_always,你就会看到你所期望的。但是你必须在协程句柄上调用 destroy ,否则你会泄漏它。

© www.soinside.com 2019 - 2024. All rights reserved.