Crossbeam:Rust 并发编程的工具箱

crossbeam 在 GitHub 上拿到了 8,450 Star,是 Rust 生态中被最广泛使用的并发工具库之一。

这个项目定位很明确:一个并发编程工具箱。原子操作、无锁队列、工作窃取调度、epoch 垃圾回收,Rust 并发编程里绕不开的那些组件,它全部封装好放在一起。Tokio、TiKV、Tantivy 这些 Rust 一线项目都有它的身影。

正文顶部截图

1、 这玩意儿是干嘛的

给 Rust 并发编程提供基础组件。

Rust 标准库有 std::sync::mpsc 做通道,有 ArcMutex 做共享,但离生产级并发编程还差不少东西。标准库的通道是 MPSC(多生产者单消费者),多对多场景直接歇菜。标准库的 Mutex 在大量读少量写的场景下锁竞争严重。要写一个线程池,工作窃取调度得自己从零实现。

Crossbeam 填的就是这些坑。它把并发编程的常见需求拆成 5 个子 crate,各管一块,按需取用。

2、 为什么要用它

写过多线程 Rust 的人都体会过:Arc<Mutex<T>> 能用,但远不够用。想自己实现并发数据结构的话,内存序、ABA 问题、伪共享、无锁算法这些话题一个比一个棘手,写对的成本很高。

Crossbeam 把这些难啃的骨头啃下来,封装成安全的 API。拿 crossbeam-epoch 举例,它实现了一套 epoch-based 垃圾回收机制,让你能构建无锁数据结构而不用手动处理悬垂指针和内存回收时机。这背后是整套内存回收理论,用的时候只需要关心自己的业务逻辑。

另一个例子是 scope 函数。标准库的 std::thread::spawn 要求闭包必须是 'static 的,传进去的数据必须拥有所有权,要么 move 要么套 Arccrossbeam::scope 打破了这个限制,让子线程可以直接借用栈上的局部变量,编译器在编译期保证所有子线程在 scope 返回前完成。省掉了不必要的堆分配和引用计数开销。

README区域截图

3、 里面有什么

Crossbeam 装了 5 个子 crate:

crossbeam-channel:多生产者多消费者通道。标准库只给了 mpsc,这个是 mpmc。支持 select 操作,可以同时等待多个通道,处理超时和关闭信号。

crossbeam-deque:工作窃取双端队列。写线程池和任务调度器的时候,这是核心数据结构:空闲线程从繁忙线程的队列尾部"偷"任务执行,让多核 CPU 的利用率拉满。

crossbeam-epoch:epoch 垃圾回收。构建无锁并发数据结构的基石,通过 epoch 划分来安全回收被多个线程共享的内存。这是 Crossbeam 中技术复杂度最高的组件。

crossbeam-queue:并发队列。ArrayQueue 是固定容量的 MPMC 队列,SegQueue 是动态增长的分段队列。都在构造时分配内存,后续 push/pop 都是无锁的。支持 no_std 环境。

crossbeam-utils:各种工具组件。CachePadded 把数据对齐到缓存行大小防止伪共享。Backoff 给自旋等待加指数退避,避免 CPU 空转。AtomicCell 提供线程安全的可变内存位置。Parker 是线程挂起和唤醒的轻量原语。WaitGroup 用于同步一组计算任务的开始或结束。

还有一个实验性质的 crossbeam-skiplist,基于无锁跳表实现的并发 map 和 set,暂时没收进主箱,可以单独试用。

4、 怎么用

要求 Rust 1.74 及以上版本。

Cargo.toml 里加一行:

crossbeam = "0.8"

如果只需要某个子 crate,单独引用更轻量:

crossbeam-channel = "0.5"
crossbeam-deque = "0.8"

用 scope 做并行数据处理的实际例子:

use crossbeam::thread::scope;

let data = vec![1, 2, 3, 4, 5, 6, 7, 8];
scope(|s| {
    for chunk in data.chunks(2) {
        s.spawn(move |_| {
            let sum: i32 = chunk.iter().sum();
            println!("chunk sum: {}", sum);
        });
    }
}).unwrap();

每个 chunk 在独立线程中计算,scope 保证所有线程在返回前完成,data 不需要 Arc 包裹。

5、 适合哪些人用

  • 在用 Rust 写服务端、数据库、搜索引擎等对性能有要求的项目的开发者
  • 需要构建线程池、调度器、无锁数据结构的系统程序员
  • 想深入理解并发编程又不想从零造轮子的学习者

Crossbeam 的内核小、API 干净、文档清晰。它不是框架,不要求你改变代码结构。需要什么功能就引入对应的子 crate,其余代码完全不受影响。

子的学习者

Crossbeam 的内核小、API 干净、文档清晰。它不是框架,不要求你改变代码结构。需要什么功能就引入对应的子 crate,其余代码完全不受影响。

更多推荐