Mutex

Mutex<T> ensures mutual exclusion and allows mutable access to T behind a read-only interface (another form of interior mutability):

use std::sync::Mutex;

fn main() {
    let v = Mutex::new(vec![10, 20, 30]);
    println!("v: {:?}", v.lock().unwrap());

    {
        let mut guard = v.lock().unwrap();
        guard.push(40);
    }

    println!("v: {:?}", v.lock().unwrap());
}

Observe como temos uma implementação impl<T: Send> Sync for Mutex<T> encoberta.

  • Mutex em Rust Ă© semelhante a uma coleção com apenas um elemento — os dados protegidos.
    • NĂŁo Ă© possĂ­vel esquecer de adquirir o mutex antes de acessar os dados protegidos.
  • VocĂȘ pode obter um &mut T de um &Mutex<T> obtendo um lock. O MutexGuard garante que o &mut T nĂŁo sobrevive alĂ©m do lock obtido.
  • Mutex<T> implementa ambos Send e Sync sse (se e somente se) T implementa Send.
  • Um lock para leitura e gravação: RwLock.
  • Por que lock() retorna um Result?
    • Se o thread que manteve o Mutex entrou em pĂąnico, o Mutex torna-se “envenenado” para sinalizar que os dados protegidos podem estar em um estado inconsistente. Chamar lock() em um mutex envenenado falha com um PoisonError. VocĂȘ pode chamar into_inner() no erro para recuperar os dados de qualquer maneira.