1 个不稳定版本

使用旧Rust 2015

0.2.1 2020年6月14日

#1032 in 并发

MIT/Apache

97KB
2K SLoC

无锁

这是一个尝试构建有用的无锁高级数据结构,通过设计简单、可组合的原语并逐步构建复杂性来实现的。

在这些原语之上构建的大多数数据结构,都设计为在主要功能期间不进行分配。分配仅在设置期间或克隆数据结构的句柄时进行。

这种轻量级的设计是与其他提供无锁算法的crate的主要区别,这意味着这里提供的所有容器都不是无界的。

模块

primitives

此模块包含简单的、低级别的构建块,可以单独使用。

目前,这包括

  • AppendList - 一个只添加列表,可以并发迭代。
  • AtomicCell - 一个类似于 Cell 的类型,仅支持原子 swap 操作。
  • AtomicExt - 一组简化原子操作的扩展方法。
  • IndexAllocator - 一种可以从连续的块分配ID的类型。
  • PrependList - 一个只添加列表,也支持原子 swap 操作。

handle

此模块创建了一个用于数据共享所有权的抽象,其中每个所有者都会自动分配一个唯一的ID。

有多个实现

  • BoundedIdHandle 完全无锁和无分配,但对并发所有者的数量有一个预定义的限制。超过此限制将导致panic。
  • ResizingIdHandle 将数据结构包装在一个 parking_lot::RwLock 中。正常使用仍然无锁和无分配,但超过最大并发所有者数量将导致获取写锁,并且数据结构将自动调整大小以容纳额外的所有者。

containers

此模块包含中等级别的数据结构,通常基于 IdHandle 抽象。

目前,这包括

  • Storage - 为其他容器提供大于 usize 的值的存储。
  • Scratch - 提供一个擦除空间,每个访问者可以在其更改以原子方式对其他访问者可见之前在此空间中工作。
  • AtomicCell - 是对原始 AtomicCell 的替代方案,进行了一些不同的权衡。它稍微慢一点(基准测试中大约慢15%),但可以组合成基于 IdHandle 抽象的其他数据结构。
  • AtomicCellArray - 功能上等同于 Vec<AtomicCell<T>>,但内存效率更高。
  • MpscQueue - 一个多生产者、单消费者队列。这个队列不试图做到公平,所以可能有一个生产者会饿死其他生产者。队列也不提供在可能继续时唤醒发送者/接收者的机制,因此必须轮询。
  • MpmcQueue - 一个实验性的多生产者、多消费者队列。没有公平保证,也没有唤醒机制。

sync

此模块包含与 futures-rs 兼容的高级数据结构。

目前,这包括

  • MpscQueue - 一个多生产者、单消费者队列。这个队列是公平的,所以单个生产者不能饿死其他生产者。
  • MpmcQueue - 一个多生产者、多消费者队列。这个队列对生产者是公平的,所以单个生产者不能饿死其他生产者,在关闭之前,它也对接收者是公平的。一旦关闭,任何接收者都可以清空队列。

贡献

  1. 复制它!
  2. 创建您的功能分支: git checkout -b my-new-feature
  3. 提交您的更改: git commit -am 'Add some feature'
  4. 推送到分支: git push origin my-new-feature
  5. 提交拉取请求 :D

许可

MIT OR Apache-2.0

依赖关系

~0.6–0.9MB
~14K SLoC