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 并发

Download history 69606/week @ 2024-05-02 70510/week @ 2024-05-09 85760/week @ 2024-05-16 78322/week @ 2024-05-23 127494/week @ 2024-05-30 135312/week @ 2024-06-06 121999/week @ 2024-06-13 151662/week @ 2024-06-20 116410/week @ 2024-06-27 70490/week @ 2024-07-04 85408/week @ 2024-07-11 87465/week @ 2024-07-18 86350/week @ 2024-07-25 71691/week @ 2024-08-01 80319/week @ 2024-08-08 75493/week @ 2024-08-15

每月 332,380 次下载
957 个 Crates (130 直接) 中使用

MIT 许可证

270KB
5.5K SLoC

Loom

Loom 是一个用于测试 Rust 并发代码的工具。它多次运行测试,在 C11 内存模型 下排列可能的并发执行。它使用 状态化简技术 以避免组合爆炸。

Crates.io Documentation Build Status Discord chat

快速入门

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

许可证

此项目受 MIT 许可证 的许可。

贡献

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

依赖项

~5–30MB
~422K SLoC