#![deny(warnings, rust_2018_idioms)] use loom::sync::Mutex; use loom::thread; use std::rc::Rc; #[test] #[should_panic] fn two_mutexes_deadlock() { loom::model(|| { let a = Rc::new(Mutex::new(1)); let b = Rc::new(Mutex::new(2)); let th1 = { let a = a.clone(); let b = b.clone(); thread::spawn(move || { let a_lock = a.lock().unwrap(); let b_lock = b.lock().unwrap(); assert_eq!(*a_lock + *b_lock, 3); }) }; let th2 = { thread::spawn(move || { let b_lock = b.lock().unwrap(); let a_lock = a.lock().unwrap(); assert_eq!(*a_lock + *b_lock, 3); }) }; th1.join().unwrap(); th2.join().unwrap(); }); }