#wait-free #spsc #lock-free #队列

无 std rtrb

实时安全的单生产者单消费者环形缓冲区

10 个版本

0.3.1 2024年5月26日
0.3.0 2023年11月12日
0.2.3 2022年12月13日
0.2.2 2022年3月4日
0.1.1 2020年11月20日

#33并发 类别中排名

Download history 9097/week @ 2024-05-03 9886/week @ 2024-05-10 8192/week @ 2024-05-17 7341/week @ 2024-05-24 10460/week @ 2024-05-31 8475/week @ 2024-06-07 8750/week @ 2024-06-14 9715/week @ 2024-06-21 9373/week @ 2024-06-28 10675/week @ 2024-07-05 10195/week @ 2024-07-12 8122/week @ 2024-07-19 7891/week @ 2024-07-26 9208/week @ 2024-08-02 12469/week @ 2024-08-09 11966/week @ 2024-08-16

42,904 每月下载量
50 Crates 中使用(直接使用 13 个)

MIT/Apache

78KB
697 代码行

实时环形缓冲区

Rust 的无等待单生产者单消费者(SPSC)环形缓冲区。

此包可以在不使用标准库的情况下使用(通过禁用默认启用的 std 功能),但仍然需要 alloc 包。

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
rtrb = "0.3"

重大变更

有关重大变更的列表以及如何升级到已发布版本的操作说明,请参阅 变更日志

性能

衡量线程间通信数据结构的性能可能相当脆弱,结果取决于许多因素。一些竞争包之间的性能比较可以在 问题 #39 中看到,但像所有基准测试一样,它们存在严重缺陷,应谨慎对待。您应该根据您的使用模式进行自己的测量。您可以通过在该问题下发表评论来分享您自己的结果。

开发

创建 HTML 文档(将可在 target/doc/rtrb/index.html 中找到)

cargo doc

运行测试

cargo test

测试基准(不实际进行基准测试)

cargo test --benches

运行基准测试(使用 criterion 包;结果将在 target/criterion/report/index.html 中提供)

cargo bench

为基准测试创建 火焰图;首先是一些准备工作

cargo install flamegraph
echo -1 | sudo tee /proc/sys/kernel/perf_event_paranoid
export CARGO_PROFILE_BENCH_DEBUG=true

然后,创建火焰图(将保存到flamegraph.svg),提供基准(例如two_threads),期望的运行时间和可选的基准函数(例如large

cargo flamegraph --bench two_threads -- --bench --profile-time 10 large

要测量代码覆盖率,需要夜间的Rust版本,以及一些额外的依赖项

rustup toolchain install nightly
rustup component add llvm-tools-preview
cargo install grcov

可以使用以下命令获取和测试覆盖率数据

cargo clean
RUSTFLAGS="-Z instrument-coverage" RUSTDOCFLAGS="-Z instrument-coverage -Z unstable-options --persist-doctests target/debug/doctestbins" LLVM_PROFILE_FILE="coverage/%p-%m.profraw" cargo +nightly test
grcov coverage --source-dir . --binary-path target/debug --output-type html --output-path coverage

最后一个命令将在coverage/index.html中创建一个HTML报告。

使用Miri进行测试也需要夜间的Rust

cargo +nightly miri test

还应该尝试这个Miri标志

MIRIFLAGS="-Zmiri-preemption-rate=0" cargo +nightly miri test

使用ThreadSanitizer运行测试也需要夜间的Rust

RUSTFLAGS="-Z sanitizer=thread" cargo +nightly test --tests -Z build-std --target x86_64-unknown-linux-gnu

可能需要将--target选项适配到您的系统(例如,参见rustup show)。

最低支持的rustc版本

此crate的最低支持rustc版本(MSRV)为1.38.0。MSRV预计不会频繁更新,但如果更新,至少会有一个次要版本号的提升。

起源故事

初始代码是从https://github.com/crossbeam-rs/crossbeam/pull/338中获取的,已获得PR作者的许可。

使用git-filter-repo将其从其余的crossbeam中分离出来

git-filter-repo --subdirectory-filter crossbeam-queue --path src/spsc.rs --path tests/spsc.rs --refs refs/heads/spsc

替代方案

如果您不喜欢这个crate,没有问题,您可以选择几个替代方案。有许多类型的环形缓冲区可用,这里我们仅限于无等待SPSC实现

  • ach-spsc(使用const generics)
  • heapless(适用于嵌入式系统,请参阅heapless::spsc
  • jack(JACK的FFI绑定,请参阅jack::Ringbuffer
  • magnetic(请参阅magnetic::spsc模块)
  • npnc(请参阅npnc::bounded::spsc模块)
  • ringbuf(支持const generics和堆分配)
  • ringbuffer-spsc(使用const generics)
  • shmem-ipc(请参阅shmem_ipc::sharedringshmem_ipc::ringbuf模块)

还有其他语言的实现

如果您知道此列表中的更多替代方案,请打开一个问题

许可证

根据以下之一获得许可

由你选择。

请注意,本包包含来自https://github.com/crossbeam-rs/crossbeam的文件cache_padded.rs的副本。

贡献

除非你明确说明,否则任何有意提交以包含在你所定义的工作中的贡献,根据Apache-2.0许可证,将如上双重许可,不附加任何额外条款或条件。

无运行时依赖