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 并发

MIT/Apache

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 - 多生产者、单消费者队列。此队列是公平的,因此单个生产者不能饿死其他生产者。

贡献

  1. 分叉它!
  2. 创建你的功能分支: git checkout -b my-new-feature
  3. 提交你的更改: git commit -am '添加一些功能'
  4. 推送到分支: git push origin my-new-feature
  5. 提交一个pull请求 :D

许可证

MIT OR Apache-2.0

依赖关系

~1MB
~18K SLoC