4 个版本
使用旧的 Rust 2015
0.2.0 | 2017年2月25日 |
---|---|
0.1.2 | 2017年2月14日 |
0.1.1 | 2017年2月1日 |
0.1.0 | 2017年2月1日 |
#983 in 并发
65KB
1.5K SLoC
Lockless
这是一个尝试通过设计简单、可组合的基本元素,并逐步构建复杂性来构建有用的、高级无锁数据结构的尝试。
基于这些基本元素构建的大多数数据结构,都设计为在主要功能期间不进行分配。分配仅在设置期间或克隆数据结构句柄时进行。
这种轻量级分配的设计是与其他提供无锁算法的 crate 的主要区别,这意味着这里提供的所有容器都不是无界的。
模块
primitives
此模块包含简单、低级构建块,可以单独使用。
目前,它包含以下内容:
AppendList
- 一个只添加列表,可以并发迭代。AtomicCell
- 类似于Cell
的类型,仅支持原子swap
操作。AtomicExt
- 一组简化原子操作工作的扩展方法。IndexAllocator
- 一种可以分配连续块 ID 的类型。PrependList
- 一个只预添加列表,也支持原子swap
操作。
handle
此模块创建了一个数据共享所有权的抽象,其中每个所有者都会自动分配一个唯一的 ID。
有多种实现方式:
BoundedIdHandle
完全无锁和无分配,但对并发所有者的数量有一个预定义的限制。超过此限制将导致 panic。ResizingIdHandle
使用parking_lot::RwLock
包装数据结构。正常使用仍然是无锁和无分配的,但超过最大并发所有者数量将导致获取写锁,并将数据结构自动调整大小以适应额外的所有者。
containers
此模块包含中级数据结构,通常基于 IdHandle
抽象。
目前,它包含以下内容:
AtomicCell
- 是原始AtomicCell
的替代品,进行了一些不同的权衡。它稍微慢一些(基准测试中大约慢 15%),但可以组合到基于IdHandle
抽象的其他数据结构中。AtomicCellArray
- 功能上与Vec<AtomicCell<T>>
相当,但内存效率更高。MpscQueue
- 多生产者、单消费者队列。此队列不试图实现公平性,因此可能存在一个生产者饿死其他生产者的情况。队列也不提供在可以继续时唤醒发送者/接收者的机制,因此必须进行轮询。
同步
此模块包含与futures-rs兼容的高级数据结构。
目前,它包含以下内容:
MpscQueue
- 多生产者、单消费者队列。此队列是公平的,因此单个生产者不能饿死其他生产者。
贡献
- 分叉它!
- 创建你的功能分支:
git checkout -b my-new-feature
- 提交你的更改:
git commit -am '添加一些功能'
- 推送到分支:
git push origin my-new-feature
- 提交一个pull请求 :D
许可证
MIT OR Apache-2.0
依赖关系
~1MB
~18K SLoC