c++ 20 协程例子

这篇具有很好参考价值的文章主要介绍了c++ 20 协程例子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include <chrono>
#include <coroutine>
#include <functional>
#include <iostream>
#include <queue>
#include <string>
#include <thread>

using task = std::function<void(const std::string&)>;

class executor {
private:
    std::thread work_thread_;
    std::queue<task> tasks_;

public:
    void add_task(task t) { tasks_.emplace(std::move(t)); }

    void run() {
        work_thread_ = std::thread([this]() {
            uint64_t times = 1;
            std::cout << "executor thread: " << std::this_thread::get_id() << "\n";
            while (true) {
                auto& task = tasks_.front();
                task(std::to_string(times));
                times++;
                tasks_.pop();

                using namespace std::chrono_literals;
                std::this_thread::sleep_for(1000ms);
            }
            });

        if (work_thread_.joinable()) {
            work_thread_.join();
        }
    }
};

class coroutine_task {
public:
    struct promise_type {
        std::suspend_never initial_suspend() noexcept { return {}; }

        std::suspend_always final_suspend() noexcept { return {}; }

        void unhandled_exception() noexcept {}

        coroutine_task get_return_object() noexcept {
            auto tk = coroutine_task{
                std::coroutine_handle<promise_type>::from_promise(*this) };
            return tk;
        }

        /*void return_value(int v) noexcept {}*/
        void return_void() noexcept {}

        std::suspend_always yield_value(std::string&& from) noexcept {
            value_ = std::move(from);
            return {};
        }

        std::string value_;
    };

private:
    std::coroutine_handle<promise_type> coro_;

public:
    coroutine_task(std::coroutine_handle<promise_type> h) : coro_(h) {}

    ~coroutine_task() {
        if (coro_) {
            coro_.destroy();
        }
    }

    std::string value() { return coro_.promise().value_; }
};

template <typename R, typename Executor = executor>
struct awaitable {
private:
    R buf_;
    Executor& e_;
    std::coroutine_handle<> coro_handle_;

public:
    awaitable(Executor& e) : e_(e) {}

    bool await_ready() noexcept { return false; }

    R await_resume() noexcept { return buf_; }

    void await_suspend(std::coroutine_handle<> p) noexcept {
        coro_handle_ = p;
    }

    void async_start() {
        e_.add_task([this](const R& times) {
            std::cout << "async resume thread: " << std::this_thread::get_id() << "\n";
            buf_ = times;
            coro_handle_.resume();
            });
    }
};

auto async_read(executor& e) {
    awaitable<std::string> aw{ e };
    aw.async_start();
    return aw;
}

coroutine_task coro_read1(executor& e) {
    std::cout << "coro_read1 begin thread: " << std::this_thread::get_id() << "\n";
    for (;;) {
        auto value = co_await async_read(e);
        std::cout << "1、coro_read1: " << value << " thread: " << std::this_thread::get_id() << "\n";
        value = co_await async_read(e);
        std::cout << "2、coro_read1: " << value << " thread: " << std::this_thread::get_id() << "\n";
    }
}

coroutine_task coro_read2(executor& e) {
    std::cout << "coro_read2 begin thread: " << std::this_thread::get_id() << "\n";
    for (;;) {
        auto value = co_await async_read(e);
        std::cout << "coro_read2: " << value << " thread: " << std::this_thread::get_id() << "\n";
    }
}

int main() {
    executor e;

    auto cr1 = coro_read1(e);
    auto cr2 = coro_read2(e);

    e.run();
    return 0;
}
 文章来源地址https://www.toymoban.com/news/detail-851968.html

到了这里,关于c++ 20 协程例子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Modern C++ 一个例子学习条件变量

    目录 问题程序 施魔法让BUG浮出水面 条件变量注意事项 修改程序 今天无意中看到一篇帖子,关于条件变量的,不过仔细看看发现它并达不到原本的目的。 程序如下,读者可以先想想他的本意,以及有没有问题: OK,本意显然是: 从1开始打印整数 线程t1, 打印非5的倍数 线程

    2024年01月20日
    浏览(28)
  • Rust实战(4):防御简单C++ vector容器的越界问题例子分析

    这是一个C++的简单vector容器的越界问题的小例子: func1.h func1.cpp 上面的代码是刻意制造出来的,用一个测试代码说明问题: 程序输出: 这个代码在Mac OS 系统上 make 后运行没有崩溃,但是测试代码里 std::string ret2 = sv.getElement(11); 实际上发生了数组越界。 在rust环境下创建一个

    2024年02月16日
    浏览(37)
  • 数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv)

    本系列博客参考书为, 数字图像处理第三版-冈萨雷斯 第三版教材中图片下载地址: book images downloads vs2019配置opencv可以查看:VS2019 Opencv4.5.4配置教程 后续剧情: 数字图像处理 第四章 频率域滤波 学习笔记 数字图像处理 第六章 彩色图像处理 学习笔记 数字图像处理 第七章 小

    2024年02月03日
    浏览(40)
  • C++ 20 Module

    头文件包含一直是C/C++的传统,它使代码声明与实现分离,但它有一个非常大的问题就是会被重复编译,拖累编译速度。 通常一个标准头文件 iostream 展开后可能达几十万甚至上百万行。笔者使用下面的示例进行测试,新建一个 main.cc ,内容如下: 然后分别使用g++和clang++来测

    2024年01月23日
    浏览(26)
  • C++(20):range

    C++20提供了range来简化对迭代器的使用,可以认为range是一个封装了begin和end的对象。 template class T  concept range = requires( T t ) {   ranges::begin(t); // equality-preserving for forward iterators   ranges::end  (t); }; 而对于end,range将它认为是迭代器哨位,并不要求end一定是一个跟begin相同

    2024年02月13日
    浏览(24)
  • C++(20):using enum

    C++(11):枚举类_c++11 枚举类_风静如云的博客-CSDN博客  虽然枚举类有很多有点,不过如果每次使用都需要带上枚举类的类名,那么使用起来还是稍有些不便,C++20对此进行优化,可以通过using enum在一定的作用域内开放枚举类成员的使用: 可以看到当使用using enum声明了枚举类后

    2023年04月12日
    浏览(63)
  • C++设计模式20:状态模式

    C++ 23种设计模式系列文章目录 创建型模式 第1式 工厂方法模式 第2式 抽象工厂模式 第3式 单例模式 第4式 建造者模式 第5式 原型模式 结构型模式 第6式 适配器模式 第7式 桥接模式 第8式 组合模式

    2024年02月02日
    浏览(25)
  • C++语法(20)---- 模拟红黑树

    C++语法(19)---- 模拟AVL树_哈里沃克的博客-CSDN博客 https://blog.csdn.net/m0_63488627/article/details/130229501?spm=1001.2014.3001.5501 目录 1.红黑树介绍 2.模拟实现 1.枚举红黑颜色 2.节点的定义 3.树类框架 4.插入 5.检查 3.代码实现 最长路径不超过最短路径的两倍,近似平衡 最短:全黑 最长:

    2024年02月01日
    浏览(23)
  • C++ 笔记 20 (STL函数对象)

    1. 函数对象 1.1 函数对象概念 概念: 重载 函数调用操作符 的类,其对象常称为函数对象; 函数对象使用重载的()时,行为类似函数调用,也叫仿函数。 本质: 函数对象(仿函数)是一个类,不是一个函数。 1.2 函数对象的使用 特点: 函数对象在使用时,可以像普通函数

    2024年02月02日
    浏览(35)
  • C++(20):explicit(true/false)

    explicit通常用于声明是否运行隐式转换: C++20扩展了explicit,可以通过explicit(false)来禁用,或通过explicit(true)来启用explicit

    2024年02月06日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包