败犬日报 2025-01-26
1. 锐评 libco 的文章
https://zhuanlan.zhihu.com/p/12979867707
群友指出,很多问题光看代码是看不出啥来的,需要上生产的人评论才有价值。
libco 当时应该主要是两个人写的,都在鸡架,现在应该一个是总监一个是组长,都是老程序员了,然后在此基础上搞 svrkit。
2. 有协程库不绑定调度器吗
以前没有无栈协程的语法,不方便。一般整协程都是从实践出发,没必要搞通用实现,搞起来也麻烦。对于特定场景下的使用也没啥好处。
现在 C++20 有了无栈协程,弄起来方便点了,就有很多库允许用户自己提供调度器了。例如 async simple 库。
C++26 那个 execution 的设计准则也是允许用户自己提供调度器来适应不同场景。
3. 概括无栈协程
无栈协程就是通过语法变化,编译器帮你造一个状态机。每次 await 就切换一下。
cpp 无栈协程里面有太多晦涩的接口了,主要是为了允许用户方便的自定义协程行为。
4. M:N 模型的协程跨核后,相比于线程是不是没有优势了
不是,用户态调度会更高效,Go 就是一个例子。可以看看 seastar。
之后 coroutine 调度越来越复杂,还考虑 NUMA,就会变得和 kernel scheduler 没区别了。
M:N 用在一般后台场景,1:N 一般只有基架用。
5. 一个协程问题
有一个 coroutine 世界里的 spsc queue,叫 q,consumer 为 coroutine。q 的 producer 是一个 coroutine 世界外的 thread,独占一个 CPU 核。asio 没找到这样一个 spsc queue(可能是文档太乱没找到)。
需要在一个普通线程里创建 coroutine 然后塞到 asio 调度器。
libuv 里面很容易实现这个需求,就是 uv_async。
如果是普通的协程,定义一个 awaitable,拿到 coroutine handle 之后,可以用一个简单的 post 在回调里恢复协程就行了。asio 里按作者的说法是有意限制了这种行为,不许乱搞。
群友给的一种 async initiate 实现方案:https://gist.github.com/hollykbuck/1d4faf20b2e78d515e46ddeac7a7682e
6. 协程入门文章
https://lewissbaker.github.io/
7. 无栈挂起之后指针能用吗
可以。函数参数和局部变量的内存都是动态分配的;或者自定义分配器,只要保证作用域就行。
自定义分配器嵌套多了也会性能下降,不如直接用有栈协程。
8. 隔壁周报的“对齐和隐式创建引发的问题”
https://wanghenshui.github.io/cppweeklynews/posts/176.html 里提到这个代码:https://godbolt.org/z/zj81GY8Ec