Boost.Coroutine2:学习使用Coroutine(协程)
function(函数)routine(例程)coroutine (协程)
函数,例程以及协程都是指一系列的操作的集合。
函数(有返回值)以及例程(没有返回值)也被称作subroutine(子例程),因为它们的执行过程通常在父例程之前结束。
协程则有所不同,它是例程一般化的结果。
协程的执行过程允许被
- 中途挂起。(suspend)
- 稍后恢复运行。(resume)
协程通常用于实现
- 生成器。(generators)
- 异步函数。(asynchronous functions)
两者的区别在于:
- 生成器的恢复执行由用户显式调用来决定。
- 异步函数的恢复执行由后台线程来决定。
boost::coroutines2::coroutine<>
boost::coroutines2::coroutine<>被用来实现协程。
它有两个嵌套类型:pull_type和push_type。
pull_type可以从push_type那里接收并返回数据。
push_type可以把数据传给pull_type。
#include <iostream>
#include <boost/coroutine2/coroutine.hpp>
using namespace std;
int main()
{
typedef boost::coroutines2::coroutine<int> coro_t;
int max = 8;
coro_t::pull_type source(
[&](coro_t::push_type& sink){
int first=1,second=1;
sink(first);
sink(second);
for(int i=0;i<max;++i){
int third=first+second;
first=second;
second=third;
sink(third);
}
});
for(auto i:source)
cout << i << " ";
cout << endl;
coro_t::push_type sink(
[&](coro_t::pull_type& source){
while(source){
cout << source.get() << " ";
source();
}
});
vector<int> v{1,1,2,3,5,8,13,21,34,55};
copy(begin(v),end(v),begin(sink));
}
// 1 1 2 3 5 8 13 21 34 55
// 1 1 2 3 5 8 13 21 34 55
- 这是一个使用协程实现斐波那契数列生成器的例子。
- 协程类的类型为boost::coroutines2::coroutine<int>。也就是说协程和主线程间相互传递的数据类型为int。
- pull_type类型对象source在构建时使用一个lambda来初始化。该lambda带有一个push_type的引用参数sink。使用sink可以将数据传回主线程。
C#同等功能的代码如下
using System;
using System.Collections.Generic;
namespace Sample
{
class Fibonacci
{
public static void Main(string[] args)
{
IEnumerable<int> Source(int max)
{
int first = 1, second = 1;
yield return first;
yield return second;
for (int i = 0; i < max; ++i)
{
int third = first + second;
first = second;
second = third;
yield return third;
}
}
foreach (int i in Source(8))
Console.Write($"{i} ");
Console.WriteLine();
var v = new List<int> { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 };
void Sink()
{
foreach(int i in v)
{
Console.Write($"{i} ");
}
}
Sink();
}
}
}
// 1 1 2 3 5 8 13 21 34 55
// 1 1 2 3 5 8 13 21 34 55
Boost.Coroutine2:学习使用Coroutine(协程)的更多相关文章
- python自动化开发学习 进程, 线程, 协程
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
- Coroutine(协程)模式与线程
概念 协程(Coroutine)这个概念最早是Melvin Conway在1963年提出的,是并发运算中的概念,指两个子过程通过相互协作完成某个任务,用它可以实现协作式多任务,协程(coroutine ...
- Kotlin Coroutine(协程): 二、初识协程
@ 目录 前言 一.初识协程 1.runBlocking: 阻塞协程 2.launch: 创建协程 3.Job 4.coroutineScope 5.协程取消 6.协程超时 7.async 并行任务 ...
- Kotlin Coroutine(协程): 一、样例
@ 目录 前言 一.直接上例子 1.延时任务. 2.异步任务 3.并行任务: 4.定时任务: 总结 前言 你还在用 Hanlder + Message? 或者 AsyncTask? 你还在用 Rxja ...
- Android中的Coroutine协程原理详解
前言 协程是一个并发方案.也是一种思想. 传统意义上的协程是单线程的,面对io密集型任务他的内存消耗更少,进而效率高.但是面对计算密集型的任务不如多线程并行运算效率高. 不同的语言对于协程都有不同的实 ...
- [转]向facebook学习,通过协程实现mysql查询的异步化
FROM : 通过协程实现mysql查询的异步化 前言 最近学习了赵海平的演讲,了解到facebook的mysql查询可以进行异步化,从而提高性能.由于facebook实现的比较早,他们不得不对php ...
- coroutine协程
如果你接触过lua这种小巧的脚本语言,你就会经常接触到一个叫做协程的神奇概念.大多数脚本语言都有对协程不同程度的支持.但是大多编译语言,如C/C++,根本就不知道这样的东西存在.当然也很多人研究如何在 ...
- uLua学习之使用协程(终)
前言 今天是本系列的第六篇文章,也是最后一篇,我们来看看uLua中如何来实现协程吧.首先,让我们明确协程的概念.在百度百科上的是这样说的,协程更适合于用来实现彼此熟悉的程序组件,如合作式多任务,迭代器 ...
- [Unity-22] Coroutine协程浅析
1.概念解释 协程并非一个独立的线程.在Unity中.全部的语句都是在一个线程中运行的,也就是说.Unity是单线程的(详细的能够參见http://blog.csdn.net/alexander_xf ...
- Coroutine 协程
https://en.wikipedia.org/wiki/Coroutine Coroutines are computer program components that generalize s ...
随机推荐
- stylus 知识点
循环的范围可以用两个小数点..表示,如(1..10)就是从1到10,并且包括1和10 for in 的循环范围写法: for index in 1 2 3 等价于: $li_length = 3 fo ...
- file-loader 与 url-loader 的区别
url-loader是对file-loader的一个封装,比如webpack中对图片的加载器配置 {test: /\.(png|jpg)$/, loader: 'url-loader?limit=81 ...
- vue-cli 下的 webpack 优化
app bundle 可以通过组件懒加载优化 vender 优化方法: 使用 cdn,然后在 webpack 配置中指定 externals. 利用 webpack 的插件 DllPlugin 和 D ...
- 转 JMeter之修改Sampler响应数据的编码格式
问题:JMeter的sampler响应数据中有中文时,会解析出错. JMeter的Sampler中的响应数据默认的编码格式是:ISO-8859-1.来自文件: jmeter.properties中的语 ...
- opencv读取并播放avi视屏
视屏的本质是一些静态的图像的集合,opencv可以不断读取视屏中的图片,显示,就产生了类似电影的效果. 这样也就可以通过opencv对实时的视屏流进行处理了. #include "stdaf ...
- sql distinct 去除重复的字段
居然已经有人写了 那我就直接复制其链接吧
- bzoj2048 书堆
Description Input 第一行正整数 N M Output 一行(有换行符),L,表示水平延伸最远的整数距离 (不大于答案的最大整数) 贪心地把最高的书尽量向右放可以得到最优解,因而最高的 ...
- java study2
Intellj小技巧 数组 1.java数组元素类型是唯一的,即一个数组只能存储一种数据类型的数据,而不能存储多种数据类型的数据. 2.java数组的长度,一旦初始化完成,控件就被固定,即数组的长度将 ...
- CentOS命令行性能检测工具
一.uptime Uptime命令的显示结果包括服务器已经运行了多长时间,有多少登陆用户和对服务器性能的总体评估(load average).load average值分别记录了上个1分钟,5分钟和1 ...
- [UE4]C++三种继承方式
(1) 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问. (2)私有继承(pri ...