rust怎么做鎖?
這是官方給的例子,稍微修改了一下。
notify_one() 不會阻塞。
wait() 會阻塞。
use std::collections::HashMap;
use log::info;
fn main() {
use std::sync::{Arc, Mutex, Condvar};
use std::thread;
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();
thread::spawn(move || {
loop {
thread::sleep(std::time::Duration::from_secs(4));
let (lock, cvar) = &*pair2;
let mut started = lock.lock().unwrap();
//*started = true;
cvar.notify_all(); // 非阻塞通知,notify 有一個隊列,過多的通知會被拋棄。notify 以后,需要重新 lock() 才能繼續(xù) notify()
println!("notify_all()");
}
});
for i in 0..2 {
let pair2 = pair.clone();
thread::spawn(move || {
loop {
// 注意 lock 要及時釋放,否則會導致其他線程鎖住。
{
let (lock, cvar) = &*pair2;
let mut started = lock.lock().unwrap();
println!("waiting...{}", i);
let r = cvar.wait(started);
started = r.unwrap(); // wait() 會釋放掉 mutex lock!
println!("waked: {}", i);
// thread::sleep(std::time::Duration::from_secs(2)); // 這里會產(chǎn)生互斥,通知會被挨個執(zhí)行。
}
thread::sleep(std::time::Duration::from_secs(2)); // 由于互斥鎖在前面生命周期結(jié)束釋放,所以會兵法執(zhí)行到這里,看起來像是驚群。
}
});
}
thread::park();
}