Boost之cobalt:(1)协程的一些概念

本文探讨了协程的特点,包括其轻量级、性能优势和用户态调度,以及C++20中的协程实现,着重介绍了有栈与无栈协程、对称与非对称协程的区别,以及它们在处理IO密集型任务如网络编程和文件处理中的应用。
摘要由CSDN通过智能技术生成

协程是一个可以多次调用并返回的函数,它具有自己的状态,并且能够在挂起和恢复执行之间保持这个状态。

1、协程的特点:

  • 轻量级:协程比线程更加轻量级,因为它们完全在用户态执行,不需要进行系统内核上的上下文切换。
  • 性能优势:由于协程避免了昂贵的上下文切换,它们可以带来性能的大幅提升。
  • 用户态调度:协程的上下文切换是由开发人员控制的,这意味着它们是协作式调度的用户态线程。
  • 适用场景:协程适合于实现合作式多任务、迭代器、无限列表和管道等程序组件。

2、协程的优势和适用场景

  • C++20协程提供了一种以同步的方式编写异步代码的方法,这有助于提高代码的可读性和编写效率。
  • 它们特别适合于需要处理大量IO操作的场景,如网络编程、文件处理等。

3、关于协程的一些词汇:

  • 有栈协程(Stackful Coroutines):有栈协程使用独立的调用栈来维护每个协程的执行状态。这意味着每个协程都有自己的一套寄存器和栈空间,可以在任何时刻被挂起和恢复执行,而不影响其他协程。这种实现方式使得有栈协程在切换上下文时开销较大,因为它们需要保存和恢复较多的状态信息。有栈协程通常通过用户态线程库来实现,允许开发者在堆上模拟出协程的栈空间。
  • 无栈协程(Stackless Coroutines):无栈协程不使用独立的调用栈,而是依赖程序的主调用栈。当一个函数执行时,它不会像传统函数那样在调用栈中创建新的栈帧,而是在同一个栈帧内运行,通过编译器或解释器的支持来管理局部变量和控制流。无栈协程的切换开销较小,但编写和理解它们可能需要更深入的语言特性知识。
  • 对称协程(Symmetric Coroutines):在对称协程模型中,任意一个协程都可以直接转移控制权给另一个协程,控制权转移是双向的。这种模型通常要求协程间有明确的控制转移关系,编程模型相对直观。
  • 非对称协程(Asymmetric Coroutines):非对称协程则是指协程之间的控制转移不是对等的。通常情况下,有一个调度器负责管理所有协程的执行顺序,协程之间并不直接传递控制。非对称协程更容易管理和优化,因为所有的调度逻辑都集中在调度器中。

4、C++20中的协程

  • 非对称性:C++20协程是非对称的,这意味着协程与特定的调用者绑定,当协程让出CPU时,只能让回给原调用者。
  • 无栈性:C++20协程是无栈的,它们通过主动返回结果给caller来挂起执行流;恢复执行流继续执行所需要的数据将被存储在堆上。
  • 一等对象:C++20协程是一等对象,可以在程序中像其他对象一样被传递和操作。

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值