@
w568w #3 隔了半天回来看,果然大部分回复都按自己的直觉先入为主了(没有说回复不对的意思):
Python / Lua 的非抢占式协同调用(又称生成器),
C++20 / Go 的无栈(堆)抢占式微线程,
都能称为「协程」。
还有说「协程一定是单线程的」,等谈到 Java/Kotlin 有 Scheduler 参与的协程时,又要懵逼了。
另外,支持工作分发的 OpenMP 算不算协程?这也不好说。
----
至于「线程」和「协程」的区别,品一下它们的目的就知道了:
「线程」:操作系统调度 CPU 资源的最小单位。
「协程」:多程序流协作运作的机制。
「线程」是操作系统的约定,你给操作系统一个程序地址,系统就能为这个程序分配资源。
「协程」是设计上的考虑,是开发者自己设计的、让进行不同逻辑的程序之间协作的机制。
一言蔽之,这俩从概念上就八竿子打不着,根本不是一个 level 的东西。只不过现在很多协程的实现(例如无栈微线程)就是为了解决操作系统线程在协作方面存在的问题(太贵?要考虑并发?写起来麻烦?),所以往往需要涉及线程相关的知识。
看英文也能看出:为什么线程叫 thread 而不是 routine ,协程叫 coroutine 而不是 cothread ?有没有可能它俩根本不是同一种概念?