【问题标题】:Why Mutex was designed to need an Arc in Rust为什么 Mutex 被设计为需要 Rust 中的 Arc
【发布时间】:2019-10-27 16:50:31
【问题描述】:
【问题讨论】:
标签:
rust
mutex
smart-pointers
interior-mutability
【解决方案1】:
您不需要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();
}
(Playground)