c++ 协程_理解有栈无栈协程

本文介绍了C++中的有栈和无栈协程。有栈协程通过操作系统API或汇编指令实现上下文切换,整个栈会随切换而变化。无栈协程则依赖于栈帧内保存的状态指针和堆上的状态存储,不需实际的上下文切换,只需改变调用关系。无栈协程切换更高效,但需手动控制。
摘要由CSDN通过智能技术生成

2a7d078f5e1c36a7b8526979ae718770.png

理解有栈无栈协程

可能会有错误, 只是自己简单的理解

之前一直没想明白了一个问题, 就是关于协程如何进行上下文切换.

众所周知, 协程是分为有栈协程和无栈协程俩种. 区别在于是否有自己的调用栈来进行函数调用等操作.

有栈协程

有栈协程这里的做法比较好理解, 一般来说有俩种做法:

  1. 采用操作系统提供的api 类似 ucontext 或者 setjump longjump
  2. 用汇编操控寄存器保存状态 典型的例子
static 

( 来源同班大佬同学 @蟑螂恶霸

的代码 https://github.com/cyyzero/coroutine/blob/master/src/coroutine.c)

这样每个协程切换的时候, 整个栈都会被切换, 看起来和线程没啥区别, 只是调度一个发生在用户态可以由用户控制, 一个发生在内核态由系统控制.

无栈协程

有栈协程的做法比较好理解, 那无栈线程是怎么做的呢?无栈协程是怎么利用vm自带的栈完成上下文切换? 他的状态报存在哪里呢?

首先, 先说结论, 无栈协程的实现, 要几个条件: 1. 栈帧内保存的不是状态而是指向状态的指针. 2. 所有帧的状态保存在堆上

为什么说第二点比较重要, 因为理解了第二点, 就发现, 其实根本不需要上下文切换,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值