#循环缓冲区 #缓冲区 #SPSC #队列

spsc-bip-buffer

具有大小预留的并发、SPSC 环形缓冲区

4 个版本

0.2.1 2019 年 6 月 12 日
0.2.0 2019 年 6 月 12 日
0.1.1 2019 年 1 月 30 日
0.1.0 2019 年 1 月 5 日

并发 类别中排名 1002

Download history 11/week @ 2024-03-12 6/week @ 2024-03-26 54/week @ 2024-04-02 19/week @ 2024-04-09 15/week @ 2024-04-16 37/week @ 2024-04-23 5/week @ 2024-05-14 20/week @ 2024-05-21 47/week @ 2024-05-28 64/week @ 2024-06-04 27/week @ 2024-06-11 3/week @ 2024-06-18 1/week @ 2024-06-25

每月下载量 103

MIT/Apache 许可协议

24KB
371 行代码(不含注释)

spsc-bip-buffer

Crates.io Docs

x86 arm64
Build Status Build Status

spsc-bip-buffer 是一个单生产者单消费者环形缓冲区,始终支持写入连续的数据块。无法适应可用连续区域的写入请求将等待直到有新的空间可用(消费者读取数据后)。

spsc-bip-buffer 是无锁的,并使用原子操作进行协调。

以下是一个简单的示例

use spsc_bip_buffer::bip_buffer_with_len;
let (mut writer, mut reader) = bip_buffer_with_len(256);
let sender = std::thread::spawn(move || {
    for i in 0..128 {
        let mut reservation = writer.spin_reserve(8);
        reservation.copy_from_slice(&[10, 11, 12, 13, 14, 15, 16, i]);
        reservation.send(); // optional, dropping has the same effect
    }
});
let receiver = std::thread::spawn(move || {
    for i in 0..128 {
        while reader.valid().len() < 8 {}
        assert_eq!(&reader.valid()[..8], &[10, 11, 12, 13, 14, 15, 16, i]);
        reader.consume(8);
    }
});
sender.join().unwrap();
receiver.join().unwrap();

使用文档在 docs.rs/spsc-bip-buffer

spsc-bip-buffer 受到 这篇 codeproject 上的文章 的启发,并与 James Munns35c3 的一个深夜中设计。看看他的 #[no_std] 实现:jamesmunns/bbqueue

Cargo.toml

spsc-bip-buffer = "..."

性能

截至 e2a9fa8,在 Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz 上,它在两个不同的物理核心之间发送 255 字节长消息时,实现了每秒 12.5M 次发送和 3.2 GB/s 的吞吐量(参见 examples/perf.rs 实验结果)。

许可协议

根据您的选择许可

依赖项