#wait-free #spsc #lock-free #queue #shared-ptr

no-std rtrb-basedrop

基于 rtrb 的 crate,使用基于 drop 的共享指针代替 Arc

3 个版本

0.1.2 2022 年 5 月 30 日
0.1.1 2022 年 5 月 30 日
0.1.0 2022 年 5 月 30 日

#646并发

MIT/Apache

70KB
646

实时环形缓冲区

这是对 rtrb 的 crate 的分支,使用 basedropShared 指针代替 Arc。这确保了当所有对环形缓冲区的引用都被释放时,底层的 Vec 将永远不会在实时线程中意外地被卸载(一个非实时安全的操作)。相反,所有分配都将由拥有基于 drop 的 Collector 对象的线程清理。

这对于音频应用特别有用。


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

  • crate:[https://crates.io/crates/rtrb-basedrop](https://crates.io/crates/rtrb-basedrop)
  • 文档:[https://docs.rs/rtrb-basedrop](https://docs.rs/rtrb-basedrop)

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

用法

将此添加到您的 Cargo.toml

[dependencies]
rtrb-basedrop = "0.1"

重大变更

有关重大变更的列表以及如何在版本之间升级的说明,请参阅 更改日志

开发

运行测试

cargo test

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

cargo test --benches

运行基准(使用 criterion crate;结果将在 target/criterion/report/index.html 中可用)

cargo bench

创建 HTML 文档(将在 target/doc/rtrb-basedrop/index.html 中可用)

cargo doc

要测量代码覆盖率,需要夜间 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

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

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

可能需要根据您的系统调整 --target 选项(例如,参见 rustup show)。

最小支持的 rustc 版本

本软件包最小支持的 rustc 版本(MSRV)是 1.36.0。MSRV 预计不会频繁更新,但如果更新,则至少会增加一个 次版本号

起源故事

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

它已使用 git-filter-repocrossbeam 的其余部分分离出来。

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

替代方案

如果您不喜欢这个软件包,没问题,这里有几种选择供您选择。有许多种类的环形缓冲区可用,这里我们仅限于无等待 SPSC 实现

  • fixed-queue(使用 const 泛型,参见 fixed_queue::spsc
  • heapless(用于嵌入式系统,参见 heapless::spsc
  • jack(JACK 的 FFI 绑定,参见 jack::Ringbuffer
  • npnc(参见 npnc::bounded::spsc 模块)
  • ringbuf
  • shmem-ipc(参见 shmem_ipc::sharedringshmem_ipc::ringbuf 模块)
  • spsc-bounded-queue

还有其他语言中的实现

如果您知道更多替代方案,请 创建一个 issue

许可证

根据以下任一项许可

任选其一。

贡献

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

依赖关系

~38KB