Mutex

Mutex<T> asegura la exclusión mutua y permite un acceso mutable a T a través de una interfaz de solo lectura:

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());
}

Fíjate en cómo tenemos una implementación general de impl<T: Send> Sync for Mutex<T>.

  • Mutex en Rust parece una colección con un solo elemento: los datos protegidos.
    • No es posible olvidarse de adquirir la exclusión mutua antes de acceder a los datos protegidos.
  • Puedes obtener un &mut T de Mutex<T> mediante el bloqueo. El MutexGuard asegura que &mut T no dure más tiempo que el bloqueo que se ha aplicado.
  • Mutex<T> implementa tanto Send como Sync únicamente si T implementa Send.
  • Un equivalente de bloqueo de lectura y escritura: RwLock.
  • ¿Por qué lock() devuelve un Result?
    • Si el hilo que contiene Mutex entra en pánico, Mutex se “envenena” para indicar que los datos que protegía pueden estar en un estado incoherente. Llamar a lock() en una exclusión mutua envenenada da el error PoisonError. Puedes llamar a into_inner() en el error para recuperar los datos de todos modos.