1 个不稳定版本
0.1.0 | 2024年1月14日 |
---|
#465 在 并发
265KB
5.5K SLoC
芬尼克斯
并发代码的测试。
快速入门
将此添加到您的 Cargo.toml
[target.'cfg(fenic)'.dependencies]
fenic = "0.7"
接下来,创建一个测试文件并添加测试
use fenic::sync::Arc;
use fenic::sync::atomic::AtomicUsize;
use fenic::sync::atomic::Ordering::{Acquire, Release, Relaxed};
use fenic::thread;
#[test]
#[should_panic]
fn buggy_concurrent_inc() {
fenic::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 fenic" cargo test --test buggy_concurrent_inc --release
不支持的功能
Loom 目前没有完全实现 C11 内存模型。以下是(不完整)的不支持功能的列表。
SeqCst
访问(例如load
、store
、..):它们被视为AcqRel
。也就是说,它们施加较弱的同步,导致 Loom 产生假警报(不完整)。请参阅 #180 中的示例。另一方面,fence(SeqCst)
是受支持的。- 加载缓冲行为:Loom 不探索 C11 内存模型中可能的一些执行。也就是说,即使在 Loom 表示没有错误的情况下,检查代码也可能存在错误(不正确)。请参阅
load_buffering
测试用例在tests/litmus.rs
中。
许可协议
本项目采用 MIT 许可协议。
贡献
除非您明确声明,否则您提交给 fenic
的任何有意贡献都应按 MIT 许可,没有任何附加条款或条件。
依赖关系
~5–32MB
~424K SLoC