如果使用Mutex<T>
的唯一原因是并发代码,即多个线程,为什么Mutex<T>
设计为需要Arc<T>
?首先将Mutex<T>
别名为原子引用不是更好吗?我使用 https://doc.rust-lang.org/book/ch16-03-shared-state.html 作为参考。
您不需要Arc
即可使用Mutex
。lock
(Mutex
上最常用的方法(的签名是pub fn lock(&self) -> LockResult<MutexGuard<T>>
这意味着您需要引用Mutex
。
借用检查器出现问题。当传递对可能比原始Mutex
寿命更长的线程的引用时,它无法证明某些保证。这就是为什么你使用Arc
来保证内在的价值与最后Arc
一样长
use lazy_static::lazy_static; // 1.3.0
use std::sync::Mutex;
use std::thread::spawn;
lazy_static! {
static ref M: Mutex<u32> = Mutex::new(5);
}
fn a(m: &Mutex<u32>) {
println!("{}", m.lock().unwrap());
}
fn b(m: &Mutex<u32>) {
println!("{}", m.lock().unwrap());
}
fn main() {
let t1 = spawn(|| a(&M));
let t2 = spawn(|| b(&M));
t1.join().unwrap();
t2.join().unwrap();
}
(游乐场(