C++协程

本文介绍了C++协程的产生背景、与多线程和异步IO的对比,以及协程如何处理IO密集型任务。协程在执行效率和资源利用上优于多线程,逻辑上类似同步IO,但性能接近异步IO。文中还探讨了有栈和无栈协程的实现机制及其优缺点。
摘要由CSDN通过智能技术生成

产生背景

对于后台开发我们一个重要问题即使用尽可能少的服务器资源处理海量的请求,除了我们再架构上做多机自动扩容外,我们还必须尽可能提高单机硬件的利用率(CPU利用率+IO利用率)

为了提高硬件的利用率往往我们采用三种技术路径:

  • 多线程
  • 异步IO
  • 协程

协程和异步IO以及多线程的对比

多线程

多线程可以充分利用CPU的多核,实现真正的并行,它是操作系统的基础设施。但是线程是一个粗粒度、相对比较笨重的多任务的抽象机制,例如以下几个特点

  • 创建线程非常耗时
  • 线程上下文切换非常耗时(要从用户态切换到内核态;保存当前线程执行环境;加载目标线程的执行环境;再从内核态切换回来等一系列操作)
  • 每个线程会预先分配一个几M的调用栈
  • 系统中最多只能同时运行数千个线程(当就绪线程个数远大于CPU核数,操作系统大量的时间就会用来进行线程切换,性能急剧下降)

异步IO

操作系统中有两种IO:同步IO和异步IO(5种I/O模型)

同步IO:发起IO(比如read)后,CPU必须原地等待其结束,然后才能继续往下执行

异步IO:发起IO(比如read)前,会先注册一个回调函数;发起IO后,CPU无需原地等待其完成,而是继续往下执行

C++协程是一种轻量级的线程,可以在单个线程中实现多个协程C++20引入了协程库,其中包括协程原语和一些实用程序,使协程的使用变得更加容易。下面是一个简单的C++协程实现demo: ```c++ #include <iostream> #include <coroutine> struct Generator { struct promise_type { int current_value; Generator get_return_object() { return Generator(std::coroutine_handle<promise_type>::from_promise(*this)); } auto initial_suspend() { return std::suspend_always{}; } auto final_suspend() noexcept { return std::suspend_always{}; } void unhandled_exception() {} void return_void() {} auto yield_value(int value) { current_value = value; return std::suspend_always{}; } }; std::coroutine_handle<promise_type> coroutine; Generator(std::coroutine_handle<promise_type> h) : coroutine(h) {} ~Generator() { if (coroutine) coroutine.destroy(); } int get() { coroutine.resume(); return coroutine.promise().current_value; } }; Generator counter(int begin, int end) { for (int i = begin; i <= end; ++i) co_yield i; } int main() { auto gen = counter(1, 5); while (auto value = gen.get()) std::cout << value << ' '; } ``` 这个demo中,我们定义了一个生成器(Generator)结构体和一个promise_type结构体。Generator结构体包含一个协程句柄,可以通过该句柄来操作协程。promise_type结构体定义了生成器的类型,并提供了返回对象,挂起,终止等方法。在counter函中,我们使用co_yield关键字来挂起当前协程并返回值。在主函中,我们使用while循环来不断调用协程的get方法来获取生成的值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值