c++ 有没有能够对标 golang 的 goroutine 的协程库啊?
满足 stackful,能够自动 yield 的,有没有? 看了好几个都需要手动 yield 归还 cpu,感觉有点麻烦,希望大佬指点下,不奢求同时有 channel 和 select 了
满足 stackful,能够自动 yield 的,有没有? 看了好几个都需要手动 yield 归还 cpu,感觉有点麻烦,希望大佬指点下,不奢求同时有 channel 和 select 了
大家常说它是协程,是因为它和协程很像,在 io 上也用 epoll, kqueue, iocp 这些系统调用,并且它也确实在 io 操作上 yield 了,老版本上的调度器还不是抢占式的。
但首先新的调试器已经是抢占式的了,这就不符合协程的定义。然后你对比一下实现的细节,显然现在的 goroutine 和 thread 更接近。
别人怎么说并不重要,你得去看实际的东西。
Go 1.14 发布日期是:25 February 2020
早些年,coroutine 概念还几乎不见于日常开发,很多操作系统(比如 DOS,一些 UNIX )还不支持内核线程时,有第三方库(比如 pthread)实现用户态线程及调度,当然后来 pthread 的实现也千变万化。
你的大前提错了,推论自然全错。
https://en.wikipedia.org/wiki/Coroutine#Comparison_with_threads
协程,coroutine,co 是 cooperatively,合作协作的意思。
相对的概念是 preemptively,抢占
这是这个 coroutine 原本的意思。
在一个 stackful coroutine 的实现上加上抢占式调度,那当然可以做。
但做出来的东西就不叫 coroutine 了。
When a coroutine blocks, such as by calling a blocking system call, the run-time automatically moves other coroutines on the same operating system thread to a different, runnable thread so they won’t be blocked.
这里说的不是把多个 coroutine 放到同一个线程上来跑。是说如果有一个 coroutine 阻塞住了一个 thread,就把其它的 coroutine 放到别的线程上跑。
然后有一句话,The programmer sees none of this, which is the point. The result, which we call goroutines, …
所以总结一下就是,有一个协程,它 block 住了(比如在 python 的 async function 里面写了一句 time.sleep ),这样其它的协程就不能跑了对吧,那我们写一个高级一点的 runtime,把能跑的协程放到其它 thread 上跑。
并且把这些过程都隐藏起来,什么 yield 之类的东西都没有了,都是 runtime 里面的事情。
所以说这是一个基于 coroutine 的想法,或者说是一个经过了大改的 coroutine,还专门说了这个东西叫 goroutine 不叫 coroutine 了。
所以还是上一条回复里面说的,它改完了就不是 coroutine 了。
我知道的有以下这 3 个:
1. syscall
2. go 语句
3. 阻塞读写 chan
普通函数调用会不会调用 调度器?