#ring-buffer #lock-free #spsc #circular-buffer #producer-consumer #data-access

direct_ring_buffer

高性能、无锁的单生产者、单消费者环形缓冲区

3个不稳定版本

0.2.0 2024年6月3日
0.1.1 2024年5月30日
0.1.0 2024年5月30日

#378并发


用于 2 crates

MIT/Apache

26KB
186

直接环形缓冲区

Crates.io Documentation Build Status Crates.io License

本crate提供了一个高性能、无锁的环形缓冲区,适用于单生产者、单消费者场景。本crate的主要组件是ProducerConsumer结构,分别允许高效地写入和读取元素。

概述

环形缓冲区是一种固定大小的缓冲区,作为环形队列工作。这种实现采用无锁方法,适用于需要最小延迟的实时应用。该缓冲区支持具有Copy特质的泛型类型。主要使用Copy特质来防止使用实现Drop的类型,因为缓冲区是未初始化分配的。

特性

  • 单生产者、单消费者:适用于只有一个写者和一个读者的场景。
  • 无锁:使用原子操作进行同步,避免使用互斥锁或其他锁定机制。
  • 基于切片的I/O:支持一次使用切片读写多个元素,增强批量操作的性能。
  • 基于闭包的访问:通过闭包提供对缓冲区的直接访问,允许灵活且高效地处理元素。
  • 单元素读写:不仅支持批量操作,还支持单元素读写操作。

示例

use direct_ring_buffer::{create_ring_buffer, Producer, Consumer};

let (mut producer, mut consumer) = create_ring_buffer::<u8>(5);

// Writing data to the buffer
producer.write_slices(|data, _offset| {
    data[..3].copy_from_slice(&[1, 2, 3]);
    3
}, None);
assert!(producer.write_element(4));
assert!(producer.write_element(5));
assert_eq!(producer.available(), 0);

// Reading data from the buffer
consumer.read_slices(|data, _offset| {
    assert_eq!(data, &[1, 2, 3, 4, 5]);
    4
}, None);
assert_eq!(consumer.read_element(), Some(5));
assert_eq!(consumer.read_element(), None);
assert_eq!(consumer.available(), 0);
  1. 写入元素(步骤1):生产者使用write_slices将元素[1, 2, 3]写入缓冲区。
  2. 写入元素(步骤2):然后,生产者使用write_element将元素[4]写入缓冲区。
  3. 写入元素(步骤3):然后,生产者使用write_element将元素[5]写入缓冲区,填满缓冲区。
  4. 缓冲区检查:在这些写入操作之后,检查缓冲区是否已满。
  5. 读取元素(步骤 1):消费者使用 read_slices 从缓冲区读取前四个元素 [1, 2, 3, 4]。
  6. 读取元素(步骤 2):然后,消费者使用 read_element 读取剩余的元素 [5]。
  7. 最终缓冲区检查:最后,检查缓冲区是否为空。

安全性和性能

此实现确保通过带有适当检查的 unsafe 块安全访问元素。原子操作的使用确保了最小的同步开销,使其适用于高性能应用。

针对批量操作优化

设计用于一次性处理多个元素,减少了批量处理的开销。单元素操作可能会产生显著的开销。

许可证

许可协议为以下之一

贡献

除非您明确声明,否则任何您有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证的定义,应按上述方式双重许可,不附加任何额外条款或条件。

无运行时依赖