欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

火的一逼的协程

程序员文章站 2022-03-26 22:54:30
最近老是听说协程很火,心也很痒痒想知道这到底是个什么东西,今天就花功夫看了看Boost库里的Coroutine。谁不曾想Boost库这么难搞,等到要写代码时编译出错了。其实这也不能怪Boost,大部分Boost库都是以头文件的形式提供的,直接include就可以了。但是Coroutine这个东西用了 ......

最近老是听说协程很火,心也很痒痒想知道这到底是个什么东西,今天就花功夫看了看Boost库里的Coroutine。谁不曾想Boost库这么难搞,等到要写代码时编译出错了。其实这也不能怪Boost,大部分Boost库都是以头文件的形式提供的,直接include就可以了。但是Coroutine这个东西用了Context这么个需要编译的东西,偏偏机子上的VS2013用的SDK版本少了某个文件,编译不过。想想还是算了,了解的主要目的达到了就行。不过这里还是想吐糟一句,Coroutine对VS版本的支持真差!

协程(Coroutine)是什么

其实从名字上我们就能看出端倪,我们这里分两方面来看待。

协程,重点放在程字上,它与线程、纤程颇有关联。这三者都可以作为执行单元,不同的是层次不同:

线程,系统级执行单元。

纤程,系统级执行单元,比线程更轻量,但是需要开发者自己调度。

协程,语言级执行单元,实际上就是语言层面的纤程,需要开发者自己调度。实际上Boost.Coroutine2内部的一种实现方式就是使用了Windows的纤程(Fiber)。

线程是抢占式的,可以被系统调度,从而实现真正意义上的并发,提高运行效率;然而纤程与协程需要开发者自己调度,换句话说系统不会对它们进行调度,它们都运行在宿主线程上。原则上说,如果协程或者纤程是以函数形式实现的,那么只要它们是线程安全的,它们就能够被不同的线程执行。

协程(Coroutine),重点在routine上。顾名思义,协程与函数(或者叫例程,routine)是非常相似的。一开始我还以为Coroutine有多神奇,看了Boost.Coroutine之后明白,实际上协程也是以函数为运行载体的。只不过相比函数,协程能够被挂起、恢复。

协程有什么优点

协程的优点多是参照线程来比较的:

Context switch代价更小。 资源开销更少。

除此之外,因此协程可以认为切换调度,如果配合上完美的语法,异步程序写起来会爽的一逼,具体示例可以参考C#的async/await例子。目前为止似乎协程的应用场景都比较有限,如果自己本身不熟悉协程这个概念的话,你区看某些语法复杂的协程库写成的代码就会觉得的一脸蒙逼(例如C++的Coroutine)。当然重在理解该概念嘛。