3个不稳定版本
0.2.0 | 2024年6月3日 |
---|---|
0.1.1 | 2024年5月30日 |
0.1.0 | 2024年5月30日 |
#378 在 并发 中
用于 2 crates
26KB
186 行
直接环形缓冲区
本crate提供了一个高性能、无锁的环形缓冲区,适用于单生产者、单消费者场景。本crate的主要组件是Producer
和Consumer
结构,分别允许高效地写入和读取元素。
概述
环形缓冲区是一种固定大小的缓冲区,作为环形队列工作。这种实现采用无锁方法,适用于需要最小延迟的实时应用。该缓冲区支持具有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):生产者使用
write_slices
将元素[1, 2, 3]写入缓冲区。 - 写入元素(步骤2):然后,生产者使用
write_element
将元素[4]写入缓冲区。 - 写入元素(步骤3):然后,生产者使用
write_element
将元素[5]写入缓冲区,填满缓冲区。 - 缓冲区检查:在这些写入操作之后,检查缓冲区是否已满。
- 读取元素(步骤 1):消费者使用
read_slices
从缓冲区读取前四个元素 [1, 2, 3, 4]。 - 读取元素(步骤 2):然后,消费者使用
read_element
读取剩余的元素 [5]。 - 最终缓冲区检查:最后,检查缓冲区是否为空。
安全性和性能
此实现确保通过带有适当检查的 unsafe
块安全访问元素。原子操作的使用确保了最小的同步开销,使其适用于高性能应用。
针对批量操作优化
设计用于一次性处理多个元素,减少了批量处理的开销。单元素操作可能会产生显著的开销。
许可证
许可协议为以下之一
- Apache License,版本 2.0(《LICENSE-APACHE》或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT》)
贡献
除非您明确声明,否则任何您有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证的定义,应按上述方式双重许可,不附加任何额外条款或条件。