Rust in Everything
基于 rayon-core 1.13.0

线程池与 Registry

这一部分读 registry.rs(1002 行)和 lib.rs 里的 ThreadPoolBuilder。rayon-core 里「线程池」有两个名字:对外是 ThreadPool,它只有一个字段 registry: Arc<Registry>;真正的状态全在 Registry 里。全局池也是一个 Registry,只是放在一个 static 里、没有 ThreadPool 句柄。

  1. 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。
  2. 全局池与 Registry:Registry 的字段;Registry::new 为每个线程建两条 deque;全局池 static mut + Once 的懒初始化,以及第二次 build_global 的报错(E10);不支持线程的平台的回退;terminate_count 与 ThreadPool::drop 不等线程退出。
  3. WorkerThread 主循环:WorkerThread 的字段和线程本地指针;main_loop;找活顺序 find_work(本地 → 广播 → 偷 → 注入);wait_until_cold 的双层循环;steal 的随机起点和 Retry 整轮重来。
  4. 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

💬 关联讨论

发起讨论
加载中...