协程(coroutine)
一、定义
协程是由Melvin Conway于1958年首次提出,这个概念主要是针对线程和进程上的差别进行区别的(进程:操作系统管理单元,线程:代码执行控制单元),由于进程和线程都由操作系统进行控制管理,所以进程和线程上下文切换就需要进行操作系统权限切换相对代价比较高,协程就是在这样的一个理念上提出的,他们的一个关系属于一对多的关系(process->threads->corotines)。
二、协程原理
协程上下文切换主要是在用户层进行,并且由用户自己进行执行流的控制,协程按照执行控制流可以分为:
类型 | 描述 |
---|---|
对称型 | 协程上下文可以任意的切换,无需通过中间人进行切换 |
非对称型 | 协程的上下文切换必须经过中间人才能切换 |
按照协程是否有自有堆栈,可以分为有栈协程和无栈协程(用系统栈存储切换上下文),无栈协程相对有栈协程操作上灵活性会有一定牺牲。
三、协程使用
-
协程使用可以用boost coroutine;
-
协程IO库使用可以用wechart;
-
协程实现原理基础库;
个人认为协程主要是应用多任务切换以及相互间依赖关系密切的应用场景,这样通过协程操作可以让一致性的操作压缩到一个线程内,避免加锁的开销类似于流水线模式