开发者社区> 问答> 正文

co_await Awaiter<false>{}; 这行代码在协程中起到了什么作用?

co_await Awaiter{}; 这行代码在协程中起到了什么作用?

#include <iostream>
#include <coroutine>

template <bool READY>
struct Awaiter {
bool await_ready() noexcept {
std::cout << "await_ready: " << READY << std::endl;
return READY;
}
void await_resume() noexcept {
std::cout << "await_resume" << std::endl;
}
void await_suspend(std::coroutine_handle<>) noexcept {
std::cout << "await_suspend" << std::endl;
}
};

struct TaskPromise {
struct promise_type {
TaskPromise get_return_object() {
std::cout << "get_return_object" << std::endl;
return TaskPromise{std::coroutine_handle<promise_type>::from_promise(*this)};
}
Awaiter<true> initial_suspend() noexcept {
std::cout << "initial_suspend" << std::endl;
return {};
}
Awaiter<true> final_suspend() noexcept {
std::cout << "final_suspend" << std::endl;
return {};
}
void unhandled_exception() {
std::cout << "unhandled_exception" << std::endl;
}
void return_void() noexcept {
std::cout << "return_void" << std::endl;
}
};

void resume() {
std::cout << "resume" << std::endl;
handle.resume();
}

std::coroutine_handle<promise_type> handle;
};

TaskPromise task_func() {
std::cout << "task first run" << std::endl;
co_await Awaiter<false>{};
std::cout << "task resume" << std::endl;
}

int main() {
auto promise = task_func();
promise.resume();

return 0;
}

展开
收起
夹心789 2024-05-29 17:01:26 30 0
1 条回答
写回答
取消 提交回答
  • 这行代码在协程中起到了挂起(Suspend)协程执行的作用。它调用 Awaiter 类型的对象的 await_suspend 方法,该方法负责将协程的执行状态保存到堆上,并将控制权交还给调用者。当协程需要恢复执行时,可以通过调用协程句柄的 resume 方法来实现。

    2024-05-29 20:31:55
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Swoole2.0原生协程高性能开发实践 立即下载
fibjs 模块重构从回调到协程 立即下载
fibjs 模块重构从回调到协程--陈垒 立即下载