为什么Mutex被设计为需要Rust中的弧

时间:2019-06-13 06:37:52

标签: rust mutex smart-pointers interior-mutability

如果使用Mutex<T>的唯一原因是用于并发代码(即多个线程),为什么Arc<T>被设计为需要Mutex<T>?首先将Mutex<T>别名为原子引用会更好吗?我使用https://doc.rust-lang.org/book/ch16-03-shared-state.html作为参考。

1 个答案:

答案 0 :(得分:9)

使用Arc不需要MutexlockMutex上最常用的方法)的签名为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