3 个版本
0.1.2 | 2022 年 5 月 30 日 |
---|---|
0.1.1 | 2022 年 5 月 30 日 |
0.1.0 | 2022 年 5 月 30 日 |
#646 在 并发
70KB
646 行
实时环形缓冲区
这是对 rtrb
的 crate 的分支,使用 basedrop
的 Shared
指针代替 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-repo 从 crossbeam
的其余部分分离出来。
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::sharedring
和shmem_ipc::ringbuf
模块) - spsc-bounded-queue
还有其他语言中的实现
- boost::lockfree::spsc_queue(C++)
- JACK 环形缓冲区(C)
- PortAudio 环形缓冲区(C)
- readerwriterqueue(C++)
- ringbuf.js(JavaScript,使用
SharedArrayBuffer
) - SPSCQueue(C++)
如果您知道更多替代方案,请 创建一个 issue。
许可证
根据以下任一项许可
- Apache License,版本 2.0(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,任何有意提交以包含在本作品中的贡献,都应按上述方式双许可,不得附加任何额外条款或条件。
依赖关系
~38KB