繁体   English   中英

为什么 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来使用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();
}

游乐场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM