【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;
}

参考资料

1. C++20新特性协程Coroutines

2. 协程初步:手把手教你写一个协程

 

posted @ 2022-05-23 15:00  苏格拉底的落泪  阅读(37)  评论(0)    收藏  举报