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(协程)的更多相关文章

  1. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  2. Coroutine(协程)模式与线程

    概念 协程(Coroutine)这个概念最早是Melvin Conway在1963年提出的,是并发运算中的概念,指两个子过程通过相互协作完成某个任务,用它可以实现协作式多任务,协程(coroutine ...

  3. Kotlin Coroutine(协程): 二、初识协程

    @ 目录 前言 一.初识协程 1.runBlocking: 阻塞协程 2.launch: 创建协程 3.Job 4.coroutineScope 5.协程取消 6.协程超时 7.async 并行任务 ...

  4. Kotlin Coroutine(协程): 一、样例

    @ 目录 前言 一.直接上例子 1.延时任务. 2.异步任务 3.并行任务: 4.定时任务: 总结 前言 你还在用 Hanlder + Message? 或者 AsyncTask? 你还在用 Rxja ...

  5. Android中的Coroutine协程原理详解

    前言 协程是一个并发方案.也是一种思想. 传统意义上的协程是单线程的,面对io密集型任务他的内存消耗更少,进而效率高.但是面对计算密集型的任务不如多线程并行运算效率高. 不同的语言对于协程都有不同的实 ...

  6. [转]向facebook学习,通过协程实现mysql查询的异步化

    FROM : 通过协程实现mysql查询的异步化 前言 最近学习了赵海平的演讲,了解到facebook的mysql查询可以进行异步化,从而提高性能.由于facebook实现的比较早,他们不得不对php ...

  7. coroutine协程

    如果你接触过lua这种小巧的脚本语言,你就会经常接触到一个叫做协程的神奇概念.大多数脚本语言都有对协程不同程度的支持.但是大多编译语言,如C/C++,根本就不知道这样的东西存在.当然也很多人研究如何在 ...

  8. uLua学习之使用协程(终)

    前言 今天是本系列的第六篇文章,也是最后一篇,我们来看看uLua中如何来实现协程吧.首先,让我们明确协程的概念.在百度百科上的是这样说的,协程更适合于用来实现彼此熟悉的程序组件,如合作式多任务,迭代器 ...

  9. [Unity-22] Coroutine协程浅析

    1.概念解释 协程并非一个独立的线程.在Unity中.全部的语句都是在一个线程中运行的,也就是说.Unity是单线程的(详细的能够參见http://blog.csdn.net/alexander_xf ...

  10. Coroutine 协程

    https://en.wikipedia.org/wiki/Coroutine Coroutines are computer program components that generalize s ...

随机推荐

  1. QString和char字符串数组之间的转换 (转)

    做串口通信时,碰到这样的问题,在Qt的界面中,我用QLineEdit对象负责显示发送和接收的文本,对其中的数据进行读取和显示使用的数据类型都是QString:但是,在对串口设备进行读写时,数据使用的形 ...

  2. JFrame 与 Frame

    JFrame是Frame的子类 Frame is part of java.awt package and exists since JDK1.0. JFrame is part of javax.s ...

  3. 大快DKhadoop开发环境安装常见问题与解决方案

    2018年度国内大数据公司排名50强本月初榜单发布,榜单上看到大快搜索跻身50强,再看看他们做的DKHadoop发行版,的确还是蛮厉害的吧!最起码这款DKHadoop用起来确实在易用性方面要更好!Dk ...

  4. SQL Server存储过程 对数组参数的循环处理

    方法一 分割 例:通过SQL Server存储过程传送数组参数删除多条记录 eg. ID 值为'1,2,3' 以下存储过程就是删除表中id号为1,2,3的记录: CREATE PROCEDURE De ...

  5. Django安装与介绍

    安装 Django是以Python为语言环境的,所以要先确保计算机上已经安装了Python. Linux ubuntu: sudo pip install Django==1.11.7 安装中指定了版 ...

  6. 【Hibernate学习笔记-3】在Spring下整合Hibernate时, 关于sessionFactory的类型的说明

    摘要 在Spring下整合Hibernate时,关于sessionFactory的配置方式主要有两种,分别为注解配置方式,和xml配置方式,下面将对这两种配置方式进行介绍. 1. sessionFac ...

  7. bzoj4232: [Neerc2011 Northern]Kids Like Cakes

    Description 给定一个n个点的严格凸多边形(各个内角<180°),现在要切出两个非退化三角形(三点不共线),要求两个三角形顶点必须是凸多边形的顶点,且三角形不可相交(但是点或边可以重合 ...

  8. Unity3D 中判断点与多边形的关系

    由点发出的射线与多边形边的交点个数,如果是偶数个说明在多边形的外面,交点个数为奇数个在多边形的内部,下面是代码: public bool IsPointInPolygon(Vector2 point, ...

  9. vmware 共享文件夹(win10下的vmware安装了centos7)

    最近研究下了docker.我的笔记本是win10系统,就尝试使用了 win10的hyper-v虚拟化技术,总是感觉占用系统较多,于是换成了vmware,在虚拟机中安装 docker容器服务. 考虑到开 ...

  10. json化的必要性

    参考文章:http://www.cnblogs.com/SanMaoSpace/p/3139186.html http://www.oschina.net/question/100267_61459