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. Apache2.4.7 + php5 + mysql thinkphp

    1. LAMP 的安装sudo apt-get install apache2 2.安装PHP sudo apt-get install  libapache2-mod-php5 php5 php5- ...

  2. paramiko不能通过cd改变路径分析

    原文: 意思就是 每次执行execute_command()会重新创建一个新的会话,而新会话的当前路径为缺省目录. (这和linux中每次终端登录类似) 解决方法: .execute_command( ...

  3. html + php 框架

    <html> <head><meta http-equiv="Content-Type" content="text/html; chars ...

  4. selenium APi

    1.查看浏览器的名字方法:name实例:drvier.name 2.删除浏览器所以的cookies方法:delete_all_cookies()实例:driver.delete_all_cookies ...

  5. 【比特币】通过dns seeds获取节点列表数据

    通过dns seeds获取节点列表数据 dns seed是什么 返回比特币网络上完整节点IP地址的DNS服务器,用于协助发现节点. 哪里可以查看到 我们在bitcoinj库中,params文件夹内为网 ...

  6. poj 3046 Ant Counting(多重集组合数)

    Ant Counting Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total ...

  7. centos 安装LAMP环境后装phpmyadmin

    首先在CentOS 上安装EPEL 要想安装EPEL,我们先要下载EPEL的rpm安装包. 1. 确认你的CentOS 的版本 首先通过以下命令确认你的CentOS 版本 $ cat /etc/Red ...

  8. Leetcode 之Simplify Path @ python

    Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...

  9. ESB初步配置文件认识

    每个项目的都有各自的场景,但是其实往小处说,场景的处理基本都是很相似,之前做copy文件的程序,其实就是一种很常见的ETL的过程(转移文件,异构系统通过文件系统交换数据,存在数据同步). 了解一下ET ...

  10. Django中间件执行流程

    中间件函数是 django 框架为我们预留的函数接口, 让我们可以干预请求和应答的过程 1. 获取浏览器端的IP地址: 使用 request.META[‘REMOTE_ADDR’] 2. 使用中间件 ...