c++ 有没有能够对标 golang 的 goroutine 的协程库啊?

2020-10-28 11:48:56 +08:00
 Yc1992

满足 stackful,能够自动 yield 的,有没有? 看了好几个都需要手动 yield 归还 cpu,感觉有点麻烦,希望大佬指点下,不奢求同时有 channel 和 select 了

7076 次点击
所在节点    C++
44 条回复
keygen88
2020-10-28 11:59:07 +08:00
协程库很多,但很多其它库不支持就比较鸡肋了,这就是个生态问题。
reus
2020-10-28 12:21:41 +08:00
goroutine 本来就不是协程,对标的就是线程
ysc3839
2020-10-28 12:23:03 +08:00
自动 yield 大概要能插入代码吧? C++ 大概没有这种能力。
而且 C++20 的 stackless coroutine 出来之后,stackful 的可能会越来越少了。
abbycin
2020-10-28 12:26:21 +08:00
libgo 看过没?
Yc1992
2020-10-28 12:59:44 +08:00
@abbycin 谢谢,正在看
Yc1992
2020-10-28 13:00:21 +08:00
@ysc3839 为什么 stackless 更多呢?
ysc3839
2020-10-28 13:01:46 +08:00
@Yc1992 因为人们会更倾向于使用语言本身的功能吧?
Yc1992
2020-10-28 13:02:11 +08:00
@reus 第一次听到这样的描述
nightwitch
2020-10-28 13:09:28 +08:00
zunceng
2020-10-28 13:18:31 +08:00
早几年用 asio coro 玩过
不过那个上面的 yield 就是对 for loop ... switch case 做了个封装 用起来还是太费脑
Yc1992
2020-10-28 13:29:07 +08:00
@nightwitch 补充一下,必须 c++11 哈
nannanziyu
2020-10-28 13:34:26 +08:00
@Yc1992
限定 c++11 的话,微软的 cpprestsdk 里有一个 pplx
catror
2020-10-28 13:38:30 +08:00
用 asio+fiber 写过一个网络程序框架,用着也还行吧
CRVV
2020-10-28 13:55:40 +08:00
@Yc1992
如果你去看 Go 的官方文档,里面明确说了这东西不是 coroutine,当然它也不是 thread,所以才起了个新名字叫 goroutine

大家常说它是协程,是因为它和协程很像,在 io 上也用 epoll, kqueue, iocp 这些系统调用,并且它也确实在 io 操作上 yield 了,老版本上的调度器还不是抢占式的。

但首先新的调试器已经是抢占式的了,这就不符合协程的定义。然后你对比一下实现的细节,显然现在的 goroutine 和 thread 更接近。

别人怎么说并不重要,你得去看实际的东西。
Yc1992
2020-10-28 15:21:17 +08:00
@CRVV 不同的调度方式而已,https://golang.org/doc/faq#goroutines 里面明确提到了 coroutine
reus
2020-10-28 16:20:28 +08:00
@Yc1992 协程当然是协作式调度,但 goroutine 并不限制调度方式,现在的实现就是有抢占式的调度方式,跑着死循环的 goroutine 也可以被抢占,所以 goroutine 并不是协程。
FAQ 那段话是 11 年前写的: https://github.com/golang/go/commit/d4a4468204448843d0dd15d2d4b89c29607a4a7e
那时候的 goroutine 确实是协作式调度,没有任何抢占机制。但现在 goroutine 已经不是 11 年前那样了,FAQ 那段话是过时的了。不会有任何协程实现可以有 goroutine 这样的性质,就算可以自动调度,也做不到抢占式调度。只有线程具有抢占式调度的特性,所以说 goroutine 对标线程。
zzzbkl
2020-10-28 17:09:52 +08:00
试试 boost fiber
Yc1992
2020-10-28 17:26:47 +08:00
@zzzbkl 看了半天,不会用,貌似要手动 yield
hdbzsgm
2020-10-28 17:51:12 +08:00
folly
wnpllrzodiac
2020-10-28 17:56:05 +08:00
st?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/719365

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX