锁
锁
在多线程中共享资源,除了原子类型之外,还可以考虑用锁来实现。在操作之前必须先获得锁,一把锁同时只能给一个线程,这样能保证同一时间只有一个线程能操作共享资源,操作完成后,再释放锁给等待的其他线程。在
use std::thread;
use std::sync::{Arc, Mutex};
fn main() {
let var : Arc<Mutex<u32>> = Arc::new(Mutex::new(5));
let share_var = var.clone();
// 创建一个新线程
let new_thread = thread::spawn(move|| {
let mut val = share_var.lock().unwrap();
println!("share value in new thread: {}", *val);
// 修改值
*val = 9;
});
// 等待新建线程先执行
new_thread.join().unwrap();
println!("share value in main thread: {}", *(var.lock().unwrap()));
}
share value in new thread: 5
share value in main thread: 9
结果都一样,看来用
为了保障锁使用的安全性问题,
use std::sync::{Arc, Mutex, Condvar};
use std::thread;
fn main() {
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();
// 创建一个新线程
thread::spawn(move|| {
let &(ref lock, ref cvar) = &*pair2;
let mut started = lock.lock().unwrap();
*started = true;
cvar.notify_one();
println!("notify main thread");
});
// 等待新线程先运行
let &(ref lock, ref cvar) = &*pair;
let mut started = lock.lock().unwrap();
while !*started {
println!("before wait");
started = cvar.wait(started).unwrap();
println!("after wait");
}
}
代码中的
在