Почему Mutex был разработан для использования Arc in Rust - PullRequest
2 голосов
/ 13 июня 2019

Почему Mutex<T> был спроектирован так, чтобы нуждаться в Arc<T>, если единственная причина для использования Mutex<T> заключается в параллельном коде, то есть в нескольких потоках? Разве не лучше было бы вначале псевдоним Mutex<T> к атомной ссылке? Я использую https://doc.rust -lang.org / book / ch16-03-shared-state.html в качестве ссылки.

1 Ответ

9 голосов
/ 13 июня 2019

Вам не нужно 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();
}

( Playground )

...