为啥 Mutex 被设计为需要 Rust 中的 Arc

Posted

技术标签:

【中文标题】为啥 Mutex 被设计为需要 Rust 中的 Arc【英文标题】:Why Mutex was designed to need an Arc in Rust为什么 Mutex 被设计为需要 Rust 中的 Arc 【发布时间】:2019-10-27 16:50:31 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您不需要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)

【讨论】:

我认为作用域线程更明显地使用 Mutex(或 RwLockAtomic)而无需引用计数:How can I pass a reference to a stack variable to a thread?。

以上是关于为啥 Mutex 被设计为需要 Rust 中的 Arc的主要内容,如果未能解决你的问题,请参考以下文章

Rust 全局变量

为啥在只需要一个字节时,Rust 使用两个字节来表示这个枚举?

需要关于Rust的细胞和参考计数类型的整体解释

Rust程序设计语言

为啥 Rust 不能为传递给过滤器的闭包推断正确的类型?

为啥 C/RUST 中的一个加法计算在结果 ASM 中有 3 个双精度浮点加法工具?