全景
这一部分先回答「rayon 是什么、什么时候该用、什么时候不该用」,再把三条主线各从头到尾走一遍。三条主线的每一步只画到「调用了哪个函数、读写了哪个原子变量或队列」,细节留给后面的部分,每一步都链过去。
- rayon 解决什么问题:数据并行、fork-join、工作窃取;和
std::thread::scope、tokio、crossbeam 的分工;两层 crate;前几卷里谁在用;不适合的场景。 - 一次 join:B 被推进本地 deque、本线程跑 A;B 被自己弹回来或被别的线程偷走两种分支;
SpinLatch什么时候需要唤醒。 - 一次 par_iter:
(0..n).into_par_iter().sum()怎样变成bridge_producer_consumer的递归,切分树有多少片叶子,为什么从main调和在池里调切得不一样。 - 一个线程睡下又醒来:active → idle → sleepy → sleeping 四个阶段,latch 的 UNSET / SLEEPY / SLEEPING / SET,发布任务的一方怎样决定叫醒谁。
flowchart LR why[rayon 解决什么问题] --> join["一次 join:rayon-core"] why --> pi["一次 par_iter:rayon"] pi -->|"每切一刀就是一次 join_context"| join join -->|"等 B 时找不到活"| sleep["睡下又醒来:sleep 模块"]
三条主线是串起来的:par_iter 的每一次切分都是一次 join_context;join 等 B 的时候如果找不到别的活,就进入 sleep 模块的那套流程。
💬 关联讨论
发起讨论加载中...