library/
locks.rs

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}