C++20 特性 协程 Coroutines(1)

C++20 特性 协程 Coroutines(1)攻略

协程是C++20新增的一种编程语言特性,可用于异步编程,可以替代传统的回调、线程等异步编程方式,用于解决利用多核CPU或者异步I/O时出现的瓶颈,提高应用程序的性能。

协程的概述

协程是指一种在函数中使用的、可以在执行中暂停和继续的计算机程序组件。简单的说,协程就是可以在函数内通过暂停/恢复来提高程序性能的一种编程语言特性。

协程有两个关键的操作:暂停和恢复。暂停时将函数的状态保存下来并退出,等到再次调用时再恢复保存的状态并继续执行下去。通过这种方式实现了在函数内部建立一个事件循环,通过简单地暂停/恢复来实现“协作式多任务处理”。

协程的基本语法

在C++中,协程通过co_awaitco_yield关键字来实现。其中co_await用于等待协程的执行结果,co_yield用于将控制权交回给调用者并返回执行结果。

#include <coroutine>
#include <iostream>

class Generator {
public:
    struct promise_type;   //coroutine需要的类型
    using handle_type = std::coroutine_handle<promise_type>;  //协程句柄

    Generator(handle_type h)
        : handle_(h)
    {
    }

    Generator(const Generator&) = delete;
    Generator(Generator&& other) noexcept //移动构造函数
        : handle_(other.handle_)
    {
        other.handle_ = nullptr;
    }

    ~Generator()
    {
        if (handle_)
            handle_.destroy();  //销毁协程
    }

    Generator& operator=(const Generator&) = delete;
    Generator& operator=(Generator&& other) noexcept
    {
        if (this != &other) {
            if (handle_)
                handle_.destroy();
            handle_ = other.handle_;
            other.handle_ = nullptr;
        }
        return *this;
    }

    int operator()()
    {
        handle_.resume();   //通过resume函数开始执行协程
        return handle_.promise().current_value;   //返回当前协程的值
    }

private:
    handle_type handle_;
};

struct Generator::promise_type {
    int current_value;

    Generator get_return_object()
    {
        return Generator{ handle_type::from_promise(*this) };  //获得协程句柄
    }
    auto initial_suspend() { return std::suspend_always{}; }
    auto final_suspend() { return std::suspend_always{}; }

    void unhandled_exception() { std::terminate(); } //应对异常
    std::suspend_always yield_value(int value)   //协程执行过程中,通过yield_value交还当前值
    {
        current_value = value;
        return {};
    }
};

Generator cofunc()
{
    co_yield 1; // 协程的第一次,即第一个数
    co_yield 2; // 第二个数
    co_yield 3; // 第三个数
}

int main()
{
    Generator g = cofunc();
    std::cout << g() << std::endl; // 输出 1
    std::cout << g() << std::endl; // 输出 2
    std::cout << g() << std::endl; // 输出 3
    return 0;
}

在main函数中通过Generator cofunc()来获得一个协程句柄,通过该句柄可以通过调用()来执行协程,执行过程中调用co_yield交回控制权,返回执行结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++20 特性 协程 Coroutines(1) - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言实现单词小帮手

    C语言实现单词小帮手攻略 介绍 单词小帮手是一个简单的命令行工具,可以将输入的英文单词翻译为中文,并给出其中文释义、发音、例句等信息。本攻略将会详细讲解如何使用C语言实现单词小帮手。 步骤 1. 数据获取 单词小帮手需要获取两种数据:英文单词和其翻译信息。我们可以通过以下方法获取这些数据: 使用爬虫抓取在线词典的数据 从一个本地的词库文件中读取数据 在有网络…

    C 2023年5月23日
    00
  • Python 分形算法代码详解

    Python 分形算法代码详解 什么是分形算法 分形算法是一种用来生成自相似图形的算法,自相似指的是该图形中每一部分都与整体相似。这种图形在数学和自然界中都有广泛的应用。 Python 分形算法框架 使用 Python 生成分形图形的基本框架如下: 初始化画布 定义绘制分形的递归函数,该函数需要接收不同的参数,以便在每个级别上画出不同的形状,同时包括停止递归…

    C 2023年5月22日
    00
  • C语言利用system调用系统命令行详情

    C语言可以利用system()函数来调用系统命令行。一般情况下,system()函数会启动一个新的进程来执行传入的命令,然后等待该进程结束后返回。在使用system()函数时,需要先包含头文件<stdlib.h>。 函数原型 int system(const char *command); 参数说明 command:需要执行的命令字符串,可以是系…

    C 2023年5月23日
    00
  • C语言实现翻译功能

    C语言实现翻译功能的攻略包含以下步骤: 确定翻译API 在开始编写翻译功能之前,必须先确定使用哪个翻译API。常用的翻译API有百度翻译API、谷歌翻译API、有道翻译API等。需要注意的是,不同的翻译API具有不同的使用规则和参数设置,使用之前需要仔细阅读相应的开发文档。 在C语言中调用API 确定了翻译API后,需要在C语言中编写代码调用该API。一般情…

    C 2023年5月23日
    00
  • VScode中C++头文件问题的终极解决方法详析

    下面是详细的攻略: VScode中C++头文件问题的终极解决方法详析 在使用VScode进行C++程序开发时,遇到头文件引用问题是非常常见的。本文将为大家介绍,在VScode中C++头文件问题的终极解决方法,以确保你在开发过程中能够顺畅地引用和编译代码。具体解决方法如下: 第一步:配置includePath 在VScode中,需要配置includePath,…

    C 2023年5月23日
    00
  • C++实现病人就医管理系统

    C++实现病人就医管理系统攻略 1. 初步计划 在开始编写程序之前,我们需要做好初步的计划,即明确程序的功能和实现方法。在病人就医管理系统中,我们需要记录病人的基本信息、就诊记录和医生信息,并能够实现基本的数据管理功能,如添加、修改、查询和删除。 同时,我们需要选择合适的数据结构和算法来实现这些功能,例如使用链表来存储病人和医生信息,使用哈希表来实现快速查询…

    C 2023年5月23日
    00
  • golang使用json格式实现增删查改的实现示例

    下面我将详细讲解一下使用 Golang 中的 json 包实现增删查改的实现示例。 增删查改简介 增删查改是非常基本的 CRUD 操作,即创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)。在 web 应用开发中,这些操作是必不可少的,而 json 格式是 web 应用开发中经常用到的数据格式。 在 Golang 中,…

    C 2023年5月23日
    00
  • C语言实战之浪漫烟花表白程序代码

    以下是针对“C语言实战之浪漫烟花表白程序代码”的完整攻略,包含了代码的实现细节和使用说明。 程序功能简介 本程序是一款基于C语言实现的烟花表白程序,可以在Windows系统中运行。在开启程序后,将会出现浪漫的烟花飞舞效果,并在屏幕中央显示一段特定的表白文字,可以为你的恋人带来浪漫的惊喜。 程序实现原理 程序基于图形库PDCurses实现,采用C语言编写。具体…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部