C++并发之协程实例(二)(计算斐波那契序列)
目录
- 1 协程
- 2 实例-计算斐波那契序列
- 2.1 斐波那契序列
- 2.2 代码
- 3 运行
1 协程
协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。
协程类图如下:

2 实例-计算斐波那契序列
2.1 斐波那契序列
斐波那契数列是一位意大利的数学家,他闲着没事去研究兔子繁殖的过程,研究着就发现,可以写成这么一个序列:1,1,2,3,5,8,13,21… 也就是每个数等于它前两个数之和。那么给你第 n 个数,问 F (n) 是多少。
用数学公式表示很简单: f(n) = f(n-1) + f(n-2)
下面的例子使用协程来计算斐波那契序列
2.2 代码
#include <coroutine>
#include <cstdint>
#include <exception>
#include <iostream>template <typename T>
struct Generator
{struct promise_type;using handle_type = std::coroutine_handle<promise_type>;struct promise_type{T value_;std::exception_ptr exception_;Generator get_return_object(){return Generator(handle_type::from_promise(*this));}std::suspend_always initial_suspend() { return {}; }std::suspend_always final_suspend() noexcept { return {}; }void unhandled_exception() { exception_ = std::current_exception(); }template<std::convertible_to<T> From>std::suspend_always yield_value(From&& from)//设置完值后挂起协程{value_ = std::forward<From>(from);return {};}void return_void() {}};handle_type h_;Generator(handle_type h) : h_(h) {}~Generator() { h_.destroy(); }explicit operator bool(){fill();return !h_.done();}T operator()(){fill();full_ = false;return std::move(h_.promise().value_);}
private:bool full_ = false;void fill(){if(!full_){h_();//if(h_.promise().exception_)std::rethrow_exception(h_.promise().exception_);full_ = true;}}
};Generator<std::uint64_t>
fibonacci_sequence(unsigned n)//斐波那契序列
{if(n == 0)co_return;//计算结束 if(n > 94)throw std::runtime_error("太大斐波那契序列,元素将会溢出");co_yield 0;//挂起协程if(n == 1)co_return;//计算结束co_yield 1;if(n == 2)co_return;std::uint64_t a = 0;std::uint64_t b = 1;for(unsigned i = 2; i < n; ++i){std::uint64_t s = a + b;co_yield s;//挂起协程a = b;b = s;}//计算结束
}int main(int argc, char *argv[])
{int n = 10;if(argc > 1)n = std::stoul(argv[1]);try{auto gen = fibonacci_sequence(n);for(int j = 0; gen; ++j)//调用operator bool()判断是gen是否计算结束std::cout << "fib(" << j << ")=" << gen() << std::endl;//调用T operator()()返回计算j对应的斐波那契序列值}catch(const std::exception& e){std::cerr << "异常: " << e.what() << std::endl;}catch(...){std::cerr << "未知异常\n";}return 0;
}
3 运行
$./example2 0
$./example2 0 1
fib(0)=0
$./example2 0 4
fib(0)=0
fib(1)=1
fib(2)=1
fib(3)=2
$./example2 0 10
fib(0)=0
fib(1)=1
fib(2)=1
fib(3)=2
fib(4)=3
fib(5)=5
fib(6)=8
fib(7)=13
fib(8)=21
fib(9)=34
$./example2 95
异常: 太大斐波那契序列,元素将会溢出
相关文章:
C++并发之协程实例(二)(计算斐波那契序列)
目录 1 协程2 实例-计算斐波那契序列2.1 斐波那契序列2.2 代码 3 运行 1 协程 协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码…...
云邮件推送服务如何配置?有哪些优势特点?
云邮件推送的性能怎么优化?如何选择邮件推送服务? 云邮件推送服务是一种基于云计算的邮件发送解决方案,能够帮助企业和个人高效地发送大规模邮件。AokSend将详细介绍如何配置云邮件推送服务,以便你能够充分利用其优势。 云邮件推…...
QT 数值型坐标轴有那些?(QValueAxis)
在Qt中,QValueAxis类用于表示数值型坐标轴,它本身没有直接的子类,但它是从QAbstractAxis这个抽象类继承而来的。QAbstractAxis是定义坐标轴属性和行为的基类,而QValueAxis则在此基础上提供了针对数值数据的具体实现。 Qt的图表模…...
《数字图像处理-OpenCV/Python》第16章:图像的特征描述
《数字图像处理-OpenCV/Python》第16章:图像的特征描述 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第16章:图像的特征描述 特征通常是针对图像中的目标或…...
React的服务器端渲染(SSR)和客户端渲染(CSR)有什么区别?
React的服务器端渲染(SSR)和客户端渲染(CSR)是两种不同的页面渲染方式,它们各自有不同的特点和适用场景: 服务器端渲染(SSR) 页面渲染: 页面在服务器上生成,然后将完整的…...
安全生产第一位,靠谱的漏油监测系统有哪些?
漏油监测系统,一般是由漏油绳、漏油控制器、监控云平台组成,用于实时检测油库、油罐、加油站、输油管道、油类化工厂等场所是否发生漏油事故。在这些地方一旦发生漏油,就极可能引发爆炸,损害到人员及财产安全。而一套靠谱的漏油监…...
基于C#、Visual Studio 2017以及.NET Framework 4.5的Log4Net使用教程
在使用Log4Net记录日志时,以下是一个基于C#、Visual Studio 2017以及.NET Framework 4.5的详细步骤教程。这个教程适合初学者,会从添加Log4Net库、配置日志、编写日志记录代码等方面进行说明。 步骤1:安装Log4Net 通过NuGet安装 打开您的Vi…...
C# —— 构造函数
什么是构造函数 构造函数: 一般在函数为类的属性初始值的作用,构造函数的名称类名 在类里面定义构造函数 方法名和类名同名 不能带返回值类型 void/非void 不能有 // 创建一个构造函数 class People {public string Name { get; set; }public int Age { get; set;…...
HTML5的新属性
pattern:用于指定输入字段的正则表达式模式。在提交表单前,输入将验证是否符合指定的模式。 pattern 属性是 HTML5 中用于表单验证的一个属性,它用于指定一个正则表达式,以验证输入字段中的值是否符合特定的模式。该属性通常与 &l…...
[C语言] 常用排序算法
冒泡排序 思路: 从小到大,找到集合中最小的放在最左边,在剩下的集合中找到最小的放在最左边以此类推。如何找到最小的?(假定左边第一个数就是最小的,让它依次和它右边的比较,如果右边的比它还小…...
【前端vue3】TypeScrip-interface(接口)和对象类型
对象类型 定义对象需要用到interface(接口),主要用来约束数据的类型满足格式 定义方式如下: interface Person {name: string;age: number; }如对象中与接口中的属性不一致会报错,必须保持一致 例如如下:…...
神经网络 torch.nn---nn.RNN()
torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) RNN — PyTorch 2.3 documentation torch.nn---nn.RNN() nn.RNN(input_sizeinput_x,hidden_sizehidden_num,num_layers1,nonlinearitytanh, #默认tanhbiasTrue, #默认是Truebatch_firstFalse,dropout0,bidirection…...
RocketMQ-记一次生产者发送消息存在超时异常
目录 1、背景说明 2、排查 2.1、防火墙 2.2、超时时间设置 2.3、服务器资源检查 2.3.1、内存、CPU等 2.3.2、磁盘空间 编辑 2.3.3、检查文件描述符 2.3.4、swap区 3、增加swap空间 3.1、创建目录 3.2、格式化 3.3、启动swap 3.4、查看效果 1、背景说明 在一次…...
ls命令的参数选项
ls命令的参数的作用 可以指定要查看的文件夹(目录)的内容,如果不指定参数,就查看当前工作目录的内容。ls 命令的选项 常用语法:ls [-a -l -h] [linux路径] -a 选项表示 all ,即列出全部内容,包括…...
网络安全:Web 安全 面试题.(文件上传漏洞)
网络安全:Web 安全 面试题.(文件上传漏洞) 网络安全面试是指在招聘过程中,面试官会针对应聘者的网络安全相关知识和技能进行评估和考察。这种面试通常包括以下几个方面: (1)基础知识:包括网络基础知识、操…...
智源联合多所高校推出首个多任务长视频评测基准MLVU
当前,研究社区亟需全面可靠的长视频理解评估基准,以解决现有视频理解评测基准在视频长度不足、类型和任务单一等方面的局限性。因此,智源联合北邮、北大和浙大等多所高校提出首个多任务长视频理解评测基准MLVU(A Comprehensive Be…...
Linux系统:线程概念 线程控制
Linux系统:线程概念 & 线程控制 线程概念轻量级进程 LWP页表 线程控制POSIX 线程库 - ptherad线程创建pthread_createpthread_self 线程退出pthread_exitpthread_cancelpthread_joinpthread_detach 线程架构线程与地址空间线程与pthread动态库 线程的优缺点 线程…...
LearnOpenGL - Android OpenGL ES 3.0 绘制纹理
系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好,窗口LearnOpenGL 笔记 - 入门 04 你好,三角形OpenGL - 如何理解 VAO 与 VBO 之间的关系LearnOpenGL - Android OpenGL ES 3.0 绘制…...
山东济南最出名的起名大师颜廷利:二十一世纪哲学的领航者
山东济南最出名的起名大师颜廷利教授:二十一世纪哲学的领航者 在哲学的天空中,颜廷利教授犹如一颗璀璨的星辰,被无数求知者誉为21世纪最杰出的思想家之一。他的理论既深邃又广博,巧妙地将东方的儒家与道家哲学与西方的思辨传统交织…...
Nginx 负载均衡实现上游服务健康检查
Nginx 负载均衡实现上游服务健康检查 Author:Arsen Date:2024/06/20 目录 Nginx 负载均衡实现上游服务健康检查 前言一、Nginx 部署并新增模块二、健康检查配置2.1 准备 nodeJS 应用程序2.2 Nginx 配置负载均衡健康检查 小结 前言 如果你使用云负载均衡…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
