协程原理剖析

本文深入探讨了协程和线程之间的主要区别,包括调度方式、同步问题、并发模型以及资源管理。协程在单一线程上运行,非抢占式调度,由程序员控制执行流程,避免了同步问题;而线程则由内核调度,可能存在资源竞争。同时,介绍了对称式和非对称式协程的概念,强调了协程在处理并发和资源效率上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

协程和线程最大的区别就是:
线程的调度是由内核来调度的,涉及到线程同步的问题。
而协程都是运行在一个线程上的,而且协程释放处理机是由程序员来决定的,天然不涉及到同步问题,因为何时运行此协程,何时退出此协程程序员说了算。
线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。

线程是在时间片内切换来实现高并发,这是抢占式调度,时间用尽被剥夺处理机。
而协程是非抢占式调度,一个协程必须主动调用函数释放处理机,否则一直占用处理机执行此协程,其它协程得不到执行。
协程就是一种特殊的函数,普通函数只能执行一次,返回一次,生命周期结束。而协程类似于goto语句,可以在函数执行期间某一行代码让出处理机,去执行其他协程,之后又从这一行代码恢复执行。

所有协程都是在一个线程上运行的,同一时间只能有一个协程在运行,而且协程是主动释放处理机的,不能被抢占,因此对于共享资源不需要加锁。因为多线程严格来说也是分时间片轮流执行,但是多线程是被动释放处理机的,io操作可能操作到一半就切换了,必须对共享资源进行保护。

协程分为对称式协程和非对称式协程

  • 对称式协程
    在函数中使用yeild释放处理机,入栈,其他所有协程可以竞争获得处理机。对称协程机制一般需要一个调度器的支持,按一定调度算法去选择 yield的目标协程
  • 非对称式协程
    在函数A中使用yeild释放处理机,只能让调用A的函数(A的调用者)获得处理机。非对称协程只能返回最初调用它的协程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值