【C++编程】协程coroutine
协程coroutine
#include <coroutine>
#include <iostream>
using namespace std;
struct CoRet {
struct promise_type {
suspend_never initial_suspend() { return {}; }
suspend_never final_suspend() noexcept { return {}; }
void unhandled_exception() {}
CoRet get_return_object() {
return { coroutine_handle<promise_type>::from_promise(*this) };
}
};
coroutine_handle<promise_type> _h;
};
struct Input {
//为false, 遇到co_await会暂停执行,进行切换
bool await_ready() { return false; }
void await_suspend(coroutine_handle<CoRet::promise_type> h) {
//h.promise()
}
int await_resume() { return 0; }
};
CoRet Guess() {
//CoRet::promise_type promise;
// CoRet ret = promise_get_return_object();
// co_await promise.initial_suspend();
std::cout << "acess func Guess: " << std::endl;
Input input;
int g = co_await input;
std::cout << "coroutine: Yout guess " << g << std::endl;
// co_await promise.final_suspend();
}
int main() {
auto ret = Guess();
std::cout << "main: make a guess ..." << std::endl;
ret._h.resume();
return 0;
}
页面定制CSS代码:
#include <coroutine>
#include <iostream>
using namespace std;
struct CoRet {
struct promise_type {
int _out;
suspend_never initial_suspend() { return {}; }
suspend_never final_suspend() noexcept { return {}; }
void unhandled_exception() {}
CoRet get_return_object() {
return { coroutine_handle<promise_type>::from_promise(*this) };
}
suspend_always yield_value(int r) {
_out = r;
return {}
}
};
coroutine_handle<promise_type> _h;
};
struct Note {
int guess;
};
struct Input {
Note& _in;
//为false, 遇到co_await会暂停执行,进行切换
bool await_ready() { return false; }
void await_suspend(coroutine_handle<CoRet::promise_type> h) {
//h.promise()
}
int await_resume() { return _in.guess; }
};
CoRet Guess(Note& note) {
//CoRet::promise_type promise;
// CoRet ret = promise_get_return_object();
// co_await promise.initial_suspend();
std::cout << "acess func Guess: " << std::endl;
Input input{note};
int g = co_await input;
std::cout << "coroutine: Yout guess " << g << std::endl;
// co_await promise.final_suspend();
}
int main() {
Note note;
auto ret = Guess(note);
std::cout << "main: make a guess ..." << std::endl;
note.guess = 10;
ret._h.resume();
return 0;
}
参考资料

浙公网安备 33010602011771号