#![deny(warnings, rust_2018_idioms)] use loom::sync::atomic::AtomicUsize; use loom::thread; use std::sync::atomic::Ordering::{Acquire, Relaxed, Release}; use std::sync::Arc; #[test] #[should_panic] fn checks_fail() { struct BuggyInc { num: AtomicUsize, } impl BuggyInc { fn new() -> BuggyInc { BuggyInc { num: AtomicUsize::new(0), } } fn inc(&self) { let curr = self.num.load(Acquire); self.num.store(curr + 1, Release); } } loom::model(|| { let buggy_inc = Arc::new(BuggyInc::new()); let ths: Vec<_> = (0..2) .map(|_| { let buggy_inc = buggy_inc.clone(); thread::spawn(move || buggy_inc.inc()) }) .collect(); for th in ths { th.join().unwrap(); } assert_eq!(2, buggy_inc.num.load(Relaxed)); }); }