6

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

4

1 回答 1

16

你不需要Arc使用 a Mutexlock(a 上最常用的方法Mutex)的签名pub fn lock(&self) -> LockResult<MutexGuard<T>>意味着您需要对Mutex.

借用检查器出现问题。在传递对可能比原始线程寿命更长的线程的引用时,它无法证明某些保证Mutex。这就是为什么你使用Arcwhich 来保证里面的价值和最后的生命一样长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();
}

游乐场

于 2019-06-13T06:50:25.533 回答