1 个不稳定版本

0.1.0 2024年1月14日

#465并发

MIT 许可协议

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 访问(例如 loadstore、..):它们被视为 AcqRel。也就是说,它们施加较弱的同步,导致 Loom 产生假警报(不完整)。请参阅 #180 中的示例。另一方面,fence(SeqCst) 是受支持的。
  • 加载缓冲行为:Loom 不探索 C11 内存模型中可能的一些执行。也就是说,即使在 Loom 表示没有错误的情况下,检查代码也可能存在错误(不正确)。请参阅 load_buffering 测试用例在 tests/litmus.rs 中。

许可协议

本项目采用 MIT 许可协议

贡献

除非您明确声明,否则您提交给 fenic 的任何有意贡献都应按 MIT 许可,没有任何附加条款或条件。

依赖关系

~5–32MB
~424K SLoC