Boost中的协程—Boost.Coroutine2

尽管可以有不同的翻译,coroutine本文被叫作协程。

概念

Coroutine是相对于routine(过程)而提出的,它与一般的父程序调用子程序的routine不同之处在于,它允许挂起一个程序执行点,过后再从挂起的地方继续运行,是一种更高级的程序运行顺序控制。为保证程序挂起再恢复,协程有其自己的栈和控制块,记录挂起时的状态。

协程有如下特点:

  1. 同其他数据类型一样,协程也是第一类(first-class)对象,可以被当参数传递等操作;
  2. 运行特点是挂起运行,离开协程,过后再进入,恢复运行;
  3. 具有对称和非对称的转移控制机制
  4. 挂起前和恢复后本地变量的值是一致的;
  5. 有stackless和stackful两种类型

对称转移是指所有协程都是对等的,协程控制权跳转时,必须显式指明将控制权转给谁。非对称转移是指协程记录调用者,因此可以隐式转移控制权(给调用者)。

stackful协程能从嵌套的栈结构中恢复,而stackless协程,因为没有保存栈,因而只能在最上层(top-level)的过程中使用,被最上层过程调用的过程就不能再挂起了,也就是不能有两个协程同时被挂起。

为实现协程,一些语言特别引入了关键字,在语言层面支持协程,但目前C++不是如此,例如下文的Boost.Asio中,虽然定义了yield,但其实是一个宏。

协程与回调函数

采用协程与采用回调通常被用来对比。而它们通常与事件驱动式编程有关。

事件驱动式编程方式如下图:

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值