noli
2018-05-13 18:42:20 +08:00
Rust 语言 在支持 fcontext 式的 coroutine 上遇到了问题,因为目前在 rust 的 stdlib 中使用了 TLS( thread local storage) 来存储一些用于支持 catch_unwind 的变量。
Rust 这种在 stdlib 级别使用 TLS 的实践方式,为实现支持 M:N 模式的 coroutine 的开发者带来了极大的阻碍。
M:N 线程和协程模型意味着 一个协程可能会被不同的线程调度运行。
但当 协程中产生崩溃的时候,如果产生崩溃前在线程 A 运行, 产生崩溃时在线程 B 运行,那么 rust 的 catch_unwind 就会出错(因为跨越了 线程 导致 catch_unwind 所使用的 TLS 数据无效 )。
C++ 使用 fcontext 没有这样的问题,因为 C++ 的 catch 和 throw 不使用 TLS 而是依赖于 编译器生成的 调用栈帧记录。
不得不说,RUST 虽然社区很开放很有活力,不过确实有几个技术决策相当缺乏远见或者暴露了技术视野狭隘的问题。这种问题不是靠人多就能避免或解决的,使用的人越多兼容性负担越大。
如果 rust 不打算破坏其 stdlib 的兼容性,rust 将来要无缝完美支持 coroutine 或者 async/await 的话,就只剩下编译器生成 状态机的一条路可走了。Zero Cost Abstraction 听着很美好,但 rust team 的人做不到呢,真可惜。