40 个版本
0.7.2 | 2024 年 4 月 23 日 |
---|---|
0.7.1 | 2023 年 10 月 2 日 |
0.7.0 | 2023 年 8 月 4 日 |
0.6.1 | 2023 年 7 月 21 日 |
0.0.1 | 2018 年 12 月 7 日 |
#12 in 并发
每月 332,380 次下载
在 957 个 Crates (130 直接) 中使用
270KB
5.5K SLoC
Loom
Loom 是一个用于测试 Rust 并发代码的工具。它多次运行测试,在 C11 内存模型 下排列可能的并发执行。它使用 状态化简技术 以避免组合爆炸。
快速入门
loom 文档 提供了更多关于如何使用 loom 的说明。但如果您只是想快速开始,首先将以下内容添加到您的 Cargo.toml
中。
[target.'cfg(loom)'.dependencies]
loom = "0.7"
接下来,创建一个测试文件并添加一个测试
use loom::sync::Arc;
use loom::sync::atomic::AtomicUsize;
use loom::sync::atomic::Ordering::{Acquire, Release, Relaxed};
use loom::thread;
#[test]
#[should_panic]
fn buggy_concurrent_inc() {
loom::model(|| {
let num = Arc::new(AtomicUsize::new(0));
let ths: Vec<_> = (0..2)
.map(|_| {
let num = num.clone();
thread::spawn(move || {
let curr = num.load(Acquire);
num.store(curr + 1, Release);
})
})
.collect();
for th in ths {
th.join().unwrap();
}
assert_eq!(2, num.load(Relaxed));
});
}
然后,使用以下命令运行测试
RUSTFLAGS="--cfg loom" cargo test --test buggy_concurrent_inc --release
不支持的特性
Loom 目前没有实现完整的 C11 内存模型。以下是(不完整)的不支持特性的列表。
SeqCst
访问(例如load
,store
,等):它们被视为AcqRel
。也就是说,它们施加了较弱的同步,导致 Loom 产生假警报(不完整)。请参阅 #180 中的示例。另一方面,fence(SeqCst)
是支持的。- 加载缓冲行为:Loom 不探索 C11 内存模型中可能的一些执行。也就是说,即使 Loom 表明没有错误,检查代码中也可能存在错误(非一致)。请参阅
tests/litmus.rs
中的load_buffering
测试用例。
许可证
此项目受 MIT 许可证 的许可。
贡献
除非您明确声明,否则您提交给 loom
的任何有意贡献都应按 MIT 许可,无需任何附加条款或条件。
依赖项
~5–30MB
~422K SLoC