线程池与 Registry
这一部分读 registry.rs(1002 行)和 lib.rs 里的 ThreadPoolBuilder。rayon-core 里「线程池」有两个名字:对外是 ThreadPool,它只有一个字段 registry: Arc<Registry>;真正的状态全在 Registry 里。全局池也是一个 Registry,只是放在一个 static 里、没有 ThreadPool 句柄。
- ThreadPoolBuilder:九个字段和默认值;线程数怎么定(
num_threads→RAYON_NUM_THREADS→ 废弃的RAYON_RS_NUM_CPUS→available_parallelism),上限 65535;build/build_global/build_scoped/spawn_handler/use_current_thread;几个 handler;废弃的 API。 - 全局池与 Registry:
Registry的字段;Registry::new为每个线程建两条 deque;全局池static mut+Once的懒初始化,以及第二次build_global的报错(E10);不支持线程的平台的回退;terminate_count与ThreadPool::drop不等线程退出。 - WorkerThread 主循环:
WorkerThread的字段和线程本地指针;main_loop;找活顺序find_work(本地 → 广播 → 偷 → 注入);wait_until_cold的双层循环;steal的随机起点和Retry整轮重来。 - in_worker:从哪进池:本池 worker 直接调用、普通线程注入后在
LockLatch上阻塞、别的池的 worker 注入后边等边干自己池的活;「当前池」是怎么定的;从池外进池的固定开销(E13)和跨池install的执行顺序(E6)。
flowchart TB
b["ThreadPoolBuilder"] -->|"build"| tp["ThreadPool{registry}"]
b -->|"build_global"| g["static THE_REGISTRY"]
tp --> r["Registry"]
g --> r
r -->|"每线程一个"| w["WorkerThread 主循环"]
user["调用线程"] -->|"in_worker:本池 / 池外 / 别的池"| r
💬 关联讨论
发起讨论加载中...