Rust in Everything
基于 crossbeam 0.8.5

全景

这一部分先回答「crossbeam 是什么、为什么还要用它」,再把三条主线各从头到尾走一遍。三条主线的每一步都只画到「调用了哪个函数、读写了哪个原子变量」,细节留给后面的部分,每一步都链过去。

  1. crossbeam 解决什么问题:一组独立的并发积木;作用域线程(1.63.0)和 channel(1.67.0 起 std::sync::mpsc 就是 crossbeam-channel 的移植)进了 std,deque、epoch、select!、AtomicCell、无锁队列和跳表仍只在这里;前几卷里谁在用。
  2. 一条消息:bounded(1) 上 send 判满、自旋、注册、park,recv 改写 stamp、notify、unpark,带上每一步 head、tail、stamp 的具体数值。
  3. 一个任务:Worker::push 与扩容,Stealer::steal 的「读 front、pin、读 back、读任务、CAS」,主人和窃取者抢最后一个任务。
  4. 一块内存的回收:epoch::pin、defer_destroy、封袋、try_advance、回收落后两个纪元的袋子。
flowchart LR
  why[crossbeam 解决什么问题] --> msg["一条消息:channel"]
  why --> task["一个任务:deque"]
  why --> reclaim["一块内存的回收:epoch"]
  task -->|"旧缓冲交给 epoch"| reclaim

三条主线不是互相独立的:deque 扩容时换下来的旧缓冲,正是交给 epoch 去回收的;三条线又都用到 CachePadded 和 Backoff。

💬 关联讨论

发起讨论
加载中...