这行代码在协程中起到了挂起(Suspend)协程执行的作用。它调用 Awaiter 类型的对象的 await_suspend ...
然后会根据是否有对可等待体的operator co_await重载来生成一个等待器(awaiter) 。
然后,awaiter::await_suspend(handle)将会被调用(这里的handle代表着当前协程的handle)。 若await_suspend返回的是void,那么控制权将立即返回给调用方。 若返回的是bool,当返回为true时,同上。返回为false时,将恢复当前协程。 最终awaiter::await_resume()将被调用。其返回值将作为整个co_await <expr>的返回值。
type>();public:usingawaiter_type=std::conditional<overwrite_operator_co_await<A>,decltype(std::f...
在C++中,co_await是C++20引入的关键字,用于实现协程(Coroutines)功能。协程是一种轻量级的多线程处理方式,允许在函数内部使用co_await关键字来暂时挂起函数执行,并在稍后恢复执行。这在异步编程中非常有用,可以使异步代码更加简洁和易读。 以下是co_await的基本语法: ...
co_return操作主要先调用Async::return_value,此时我们将测试用例的105传入。之后调用final_suspend,我们会在await_suspend里面重新resumeCoro对应的协程。具体的代码如下: structProcessUnit{intresult;Coro<void>::Handlerh;};structPromiseType{voidreturn_value(intret){unit.result=ret;}structfinal_awaiter{boolawait...
voidAwaiter::await_suspend(std::coroutine_handle<>h){if(hp_){*hp_=h;hp_=nullptr;}} await_read Awaiter还有另外两种方法。这些方法是语言所要求的。 await_ready是一种优化。如果返回true,则co_await不会暂停该函数。比如说我将return false改成return true。这个例子的协程就不会停止。会一直打印: ...
error C3312: no callable 'await_resume' function found for type 'simple_task<Result>::cannot_await_lvalue_use_std_move' The C++/WinRT custom awaiter error message remains, however. We can hack around this by fooling C++/WinRT into thinking that we are awaitable, and then get the compil...
是的,它是安全的。std::jthread的构造函数是synchronization。
From the function names on the stack, we can pull out that this code is waiting for astd::futureto become ready. (Lots of the names are strong hints, but the giveaway is_Future_awaiter.) Let’s look at howoperator co_awaitis implemented forstd::future: ...