3 use std::sync::{Arc, Mutex, RwLock};
7 let data = Arc::new(Mutex::new(0));
8 let mut threads = Vec::new();
11 let data = Arc::clone(&data);
12 let thread = thread::spawn(move || {
13 let mut data = data.lock().unwrap();
19 for thread in threads {
20 thread.join().unwrap();
23 assert!(data.try_lock().is_ok());
25 let data = Arc::try_unwrap(data).unwrap().into_inner().unwrap();
29 fn check_rwlock_write() {
30 let data = Arc::new(RwLock::new(0));
31 let mut threads = Vec::new();
34 let data = Arc::clone(&data);
35 let thread = thread::spawn(move || {
36 let mut data = data.write().unwrap();
42 for thread in threads {
43 thread.join().unwrap();
46 assert!(data.try_write().is_ok());
48 let data = Arc::try_unwrap(data).unwrap().into_inner().unwrap();
52 fn check_rwlock_read_no_deadlock() {
53 let l1 = Arc::new(RwLock::new(0));
54 let l2 = Arc::new(RwLock::new(0));
56 let l1_copy = Arc::clone(&l1);
57 let l2_copy = Arc::clone(&l2);
58 let _guard1 = l1.read().unwrap();
59 let handle = thread::spawn(move || {
60 let _guard2 = l2_copy.read().unwrap();
62 let _guard1 = l1_copy.read().unwrap();
65 let _guard2 = l2.read().unwrap();
66 handle.join().unwrap();
72 check_rwlock_read_no_deadlock();