C++协程的基本使用

C++协程的基本使用,第1张

#include 
#include 
#include 

class IntReader {
public:
    bool await_ready() {
        return false;
    }

    void await_suspend(std::coroutine_handle<> handle) {

        std::thread thread([this, handle]() {

            static int seed = 0;
            value_ = ++seed;

            handle.resume();//恢复协程执行
            });

        thread.detach();
    }

    int await_resume() {//await_resume()返回类型可以是void 也可以是其它类型,它的返回值就是co_await操作符的返回值
        return value_;
    }

private:
    int value_{};
};

class Task {
public:
    class promise_type {
    public:
        Task get_return_object() {//将协程句柄返回给Task
            return Task{ std::coroutine_handle::from_promise(*this) };
        }

        std::suspend_always yield_value(int value) {//接收co_yield返回的数据。我们希望返回数据之后立即暂停协程,所以返回类型定义成了std::supsend_always 。
            value_ = value;                         //使用co_yield的数据并执行
            return {};
        }

        void return_void() { }
        std::suspend_never initial_suspend() { return {}; }
        std::suspend_never final_suspend() noexcept { return {}; }
        void unhandled_exception() {}

        int GetValue() const {
            return value_;
        }

    private:
        int value_{};
    };

public:
    Task(std::coroutine_handle handle) : coroutine_handle_(handle) {}

    int GetValue() const {
        return coroutine_handle_.promise().GetValue();
    }

    void Next() {//恢复协程执行
        coroutine_handle_.resume();//这意味着 Task 需要拿到协程的句柄,这是在 promise_type 的 get_return_object() 中传递过去的
    }

private:
    std::coroutine_handle coroutine_handle_;
};

Task GetInt() {

    while (true) {

        IntReader reader;
        int value = co_await reader;//让协程暂停下来,等待某个操作完成之后再恢复执行
        co_yield value;//会调用yield_value()函数,将value传入
    }
}

int main() {

    auto task = GetInt();

    std::string line;
    while (std::cin >> line) {

        std::cout << task.GetValue() << std::endl;
        task.Next();
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://outofmemory.cn/langs/3002961.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-09-27
下一篇2022-09-27

随机推荐

  • 药渍是什么意思xp

    下药playps:药渍本身是指药物不小心弄在衣服上或其他地方产生的污渍,通常不容易去除。药渍是什么意思xp下药playps:药渍本身是指药物不小心弄在衣服上或其他地方产生的污渍,通常不容易去除。

    2022-12-06
    000
  • 网络语负能量爆棚是什么意思

    负能量爆棚,意思就是形容人满满的负能量,心态失衡,情绪失控,他们看待问题的角度都是绝望的,悲观的,愤怒的。形容某个人的精神状态,和正能量爆棚是对立的。不要在负能量爆棚的时候做任何决定,情绪负面的时候说

  • 网络语敏鬼是谁

    敏鬼,电视剧《假面骑士》的剧作家,脚本家井上敏树的绰号。‌‌‌‌‌‌‌‌‌井上敏树,1959年11月28日出生于日本埼玉県,成蹊大学中退,日本脚本家兼剧作家,曾为许多动画和特摄作品编写脚本。绰号:井上

    2022-12-06
    000
  • 网络语反乌托邦是什么意思

    反乌托邦(又译作“反靠乌托邦”、“敌托邦”或 "废托邦"),与乌托邦相对,指充满丑恶与不幸之地。‌‌‌‌‌反乌托邦(dystopia)一词来源自乌托邦(utopia)。它的希腊语前缀意指“坏的、不好的

    2022-12-06
    000
  • 少帅张学良有几个子女

    少帅张学良总共有五个子女,这其中包括他跟原配妻子于凤至所生的一女三子,他们分别是张闾瑛、张闾珣、张闾玗和张闾琪,还有赵四小姐为张学良所生的一个儿子张闾琳。张学良的子女们也都很优秀很出色。 少帅张学良

    2022-12-06
    000
  • 慈禧垂帘听政的地点是哪

    慈禧垂帘听政的地点在紫禁城养心殿东暖阁,同治皇帝继位后,慈禧和慈安执掌朝政,垂帘听政,光绪年间,慈安太后猝然离世,慈禧太后手握大权,而养心殿是她垂帘听政的地方,现在故宫养心殿依然保留着当初慈禧垂帘听

    2022-12-06
    000
  • 女生节在哪天

    女生节在每年的公历3月7日,三八妇女节的前一天。女生节起源于国内的各大高校,校内的学生为了响应20世纪90年代中国妇联女性&ldquo;自尊、自信、自立、自强&rdquo;的号召,陆续在校内举办女生节

    2022-12-06
    000
  • 驻马店古时候叫什么

    驻马店古时候叫汝宁、蔡州。汝宁府,古代行政区划名,府治在今河南省汝南县,区域主要包括今河南驻马店大部分及信阳部分地区。元至元30年,因断汝河上源之水经郾城入颍河,汝南水患大减,人民稍得安宁,改蔡州为汝

    2022-12-06
    000
  • 怎么区分食品级塑料袋

    非食品级塑料袋相较于食品级塑料袋在原材料,生产环节和检验制度上都有所区别。如何区分两者之间的区别呢?从感官上,我们可以通过看,闻,摸三个方法来区别。首先可以看一下,通常而言深色的塑料袋一般属于非食用级

    2022-12-06
    000

发表评论

登录后才能评论

评论列表(0条)

    保存