Skip to content

败犬日报 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

可以看这个 so:https://stackoverflow.com/questions/51126257/what-does-the-standard-say-about-unaligned-memory-access

9. 来玩数织

https://cn.puzzle-nonograms.com/?size=4