1 个不稳定版本
0.1.0 | 2019 年 7 月 2 日 |
---|
#20 在 #数据结构
用于 garbo
15KB
155 行
Bunch
一个只增的并发区域。
保证
推入区域的所有元素都不会移动或修改。所有元素都会在区域被删除时一次性删除。
由于元素在内存中不移动,因此可以安全地由多个线程并发访问。
只有在向结构中推送时才需要锁定,以确保不同线程中的分配逻辑不会相互干扰。
缺点
元素分配在堆上的多个切片中,因此不支持范围前缀。尽管如此,迭代器可能被支持。
内存布局
切片在内存中的排列模式如下
[T, T] [T, T, T, T] [T, T, T, T, T, T, T, T]
每次新分配的大小是前一次的两倍。
为了有效地从索引计算行和列,我们可以使用一个特殊的指令 usize::leading_zeros()
,它有点像对数2运算。
fn lane_offset(offset: usize) -> (usize, usize) {
let i = offset / 2 + 1;
let lane = USIZE_BITS - i.leading_zeros() as usize - 1;
let offset = offset - (2usize.pow(lane as u32) - 1) * 2;
(lane, offset)
}
依赖项
~1MB
~18K SLoC