crossbeam-utils
crossbeam-utils 是工作区里唯一不依赖其他 crossbeam crate 的一个,src/ 下 4168 行(含文档和文件内测试)。其他五个 crate 都依赖它,用得最多的是前两样:
| 章 | 类型 | 谁在用 | 本章的实验 |
|---|---|---|---|
| CachePadded | 把值对齐到一条缓存行 | channel、deque、epoch、queue、skiplist 的头尾指针和纪元;tokio、rayon 也用(或抄了一份) | E1:伪共享距离扫描 |
| Backoff | 自旋 → 让出 → 「该睡了」 | channel、deque、queue、AtomicCell 的锁 | E9:每一步的耗时 |
| AtomicCell | 任意 T 的原子单元,放不进原生原子就用全局 seqlock | channel 的 tick | E2:lock-free 类型表、锁竞争 |
| Parker 与 WaitGroup | 和线程解耦的 park 令牌;计数到零 | WaitGroup 给作用域线程用 | — |
| ShardedLock | 8 分片读写锁 | 无内部用户 | E10:扫写比例 |
| thread::scope 与 std 的 scope | 作用域线程 | 门面 crossbeam::scope | E12:子线程 panic |
flowchart TB cp[CachePadded] --> ac[AtomicCell 的 67 把锁] cp --> sl[ShardedLock 的 8 个分片] bo[Backoff] --> ac wg[WaitGroup] --> sc[thread::scope] cp --> others["channel / deque / epoch / queue"] bo --> others
cfg(crossbeam_loom) 下,AtomicCell、ShardedLock 和 thread 模块不编译,Backoff、Parker、WaitGroup 换成 loom 的原语(怎么验证并发代码)。no_std 下只剩 CachePadded、Backoff(snooze 不让出)、AtomicCell 和 AtomicConsume。
AtomicConsume(load_consume)不单独成章,放在 本库里的内存序 里讲。
💬 关联讨论
发起讨论加载中...