C++ 协程

1.基础知识

1.1 进程-->线程-->协程

进程:
1.系统资源分配的最小单位
2.由系统内核调度,处于内核态
线程:
1.系统调度(分配cpu时间片)的最小单位
2.一个进程内的线程共享资源
3.系统内核调度,处于内核态
协程:
1.一个线程可分为多个协程
2.协程处于用户态,由用户进行调度控制
3.因为处于用户态,同一个线程内的协程一定是在一个cpu上串行执行

1.2 协程的上下文

执行过程中的寄存器、变量、地址等信息

1.3 对称协程和非对称协程

对称协程:控制权我想给谁就给谁。协程可以不受限制地将控制权交给任何其他协程。任何⼀个协程都是相互独⽴且平等的,调度权可以在
任意协程之间转移。

⾮对称协程:控制权只能交还给给我控制权的那个协程。是指协程之间存在类似堆栈的调⽤⽅-被调⽤⽅关系。协程出让调度权的⽬标只能是它的调⽤者。

1.4 有栈协程和无栈协程

关键点:当协程切换时,有没有独⽴的执⾏栈来保存协程的上下⽂信息
无栈协程将上下文保存在堆中,协程切换时,使⽤状态机来切换,就不⽤切换对应的上
下⽂了,因为都在堆⾥的。⽐有栈协程都要轻量许多。

 1.4.1 独⽴栈与共享栈

关键点:是每个协程有一个独立栈还是所有协程共享一个栈
共享栈耗时;独立栈浪费内存空间,容易溢出(栈不容易扩展,给少了溢出,给多了浪费)

 1.5 协程的优缺点

优点:
1.提⾼资源利⽤率,提⾼程序并发性能。协程允许开发者编写异步代码,实现⾮阻塞的并发操作,通过在适当的
时候挂起和恢复协程,可以有效地管理多个任务的执⾏,提⾼程序的并发性能。与线程相⽐,协程是轻量级
的,它们的创建和上下⽂切换开销较⼩,可以同时执⾏⼤量的协程,⽽不会导致系统负载过重,可以在单线程
下实现异步,使程序不存在阻塞阶段,充分利⽤cpu资源。
2.简化异步编程逻辑。使⽤协程可以简化并发编程的复杂性,通过使⽤适当的协程库或语⾔特性,可以避免显式
的线程同步、锁和互斥量等并发编程的常⻅问题,⽤同步的思想就可以编写成异步的程序。
缺点:
1.难以调试、占⽤更多内存
2.⽆法利⽤多核资源。线程才是系统调度的基本单位,单线程下的多协程本质上还是串⾏执⾏的,只能⽤到单核
计算资源,所以协程往往要与多线程、多进程⼀起使⽤。

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方法来获取生成的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值