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

Why Mutex was designed to need an Arc in Rust

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

您不需要 Arc 来使用 MutexlockMutex 上最常用的方法)的签名是 pub fn lock(&self) -> LockResult<MutexGuard<T>>,这意味着您需要引用 Mutex.

borrow-checker 出现问题。在传递对可能比原始 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)