1use std::error::Error;
2use std::rc::Rc;
3use std::sync::{Arc, Mutex};
4use std::thread;
5
6use log::info;
7
8pub fn lock_test() -> Result<(), Box<dyn Error>> {
9 let m = Mutex::new(5);
10 {
11 let mut val = m.lock().map_err(|_| "mutex err -1")?;
12 *val += 1;
13 }
14 info!("mutex = {:?}", m);
15
16 let val = *m.lock().map_err(|_| "mutex err 0")?;
17 info!("val = {}", *m.lock().map_err(|_| "mutex err 1")?);
18 info!("val = {}", val);
19
20 Err("lock test error".into())
21}
22
23pub fn lock_thread_test() -> Result<(), Box<dyn Error>> {
24 let counter = Arc::new(Mutex::new(0));
25 let mut handlers = vec![];
26 for _ in 0..10 {
27 let c = Arc::clone(&counter);
28 let h = thread::spawn(move || {
29 let mut val = c.lock().unwrap();
30 *val += 1;
31 });
32 handlers.push(h);
33 }
34 for h in handlers {
35 h.join().map_err(|_| "join error")?;
36 }
37 info!("counter = {}", *counter.lock().unwrap());
38 Ok(())
39}