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