pi_buckets - 自动扩展的并发存储桶
pi_buckets 是一个为高并发场景设计的无锁、自动扩展的存储桶集合库。它提供了一种独特的动态存储方法,避免了昂贵的重分配操作,同时保持线程安全。
主要特性
- 自动扩展的存储桶:当现有桶填满时自动创建新桶
- 无锁读取:支持并发读取而无需阻塞
- 线程安全的写入:安全的并发修改操作
- 固定桶大小:每个桶都是固定大小的
Vec,永不调整大小 - 高效迭代:以最小开销遍历所有元素
- 最小化分配:仅在需要时分配存储桶
- 超大容量:支持最多
u32::MAX - 32个元素
设计原理
Buckets<T> 结构由多个固定大小的存储桶组成:
- 第一个桶:32 个元素
- 后续每个桶:前一个桶大小的两倍
- 当一个桶填满时,会分配一个新桶
- 桶永远不会调整大小 - 新元素会放入新桶中
这种设计避免了传统向量昂贵的重分配成本,同时保持了 O(1) 的访问时间复杂度。
性能特点
存储桶迭代比 Vec 迭代慢 1-10 倍,原因包括:
- 切换桶时的原子操作
- 跨桶边界时的缓存失效
- 这种折衷是为了实现无需重分配的自动扩展
使用示例
基本用法
use ;
// 创建存储桶
let mut arr = buckets!;
// 获取元素
assert_eq!;
// 设置元素
arr.set;
assert_eq!;
// 自动分配
*arr.alloc = 4;
assert_eq!;
并发使用
use ;
use Arc;
let arr = new;
// 创建多个线程并发写入
let threads =
.map
.;
// 等待所有线程完成
for thread in threads
// 验证所有写入都成功
for i in 0..6
高级操作
use ;
let arr = buckets!;
// 范围迭代
let mut slice_iter = arr.slice;
assert_eq!;
assert_eq!;
assert_eq!;
// 克隆存储桶
let mut cloned = arr.clone;
cloned.set;
assert_eq!; // 原始未改变
assert_eq!; // 克隆已修改
// 元素扩展
arr.extend;
assert_eq!;
assert_eq!;
assert_eq!;
宏支持
buckets! 宏提供了方便的初始化语法:
// 创建空桶
let empty = buckets!;
// 创建重复元素的桶
let ones = buckets!; // [1, 1, 1]
// 从元素列表创建
let values = buckets!; // [10, 20, 30]
位置计算
Location 结构用于计算元素位置:
use Location;
let loc = of;
assert_eq!; // 桶索引
assert_eq!; // 桶内位置
assert_eq!; // 桶大小
// 位置转换
assert_eq!; // 绝对位置
贡献者
感谢所有为 pi_buckets 项目做出贡献的开发者。
贡献
欢迎提交问题、拉取请求和改进建议。请确保遵循项目的贡献指南。
许可证
本项目采用 MIT 或 Apache-2.0 许可证。请查看 LICENSE 文件了解更多信息。