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
deMutex<T>
mediante el bloqueo. ElMutexGuard
asegura que&mut T
no dure más tiempo que el bloqueo que se ha aplicado. Mutex<T>
implementa tantoSend
comoSync
únicamente siT
implementaSend
.- Un equivalente de bloqueo de lectura y escritura:
RwLock
. - ¿Por qué
lock()
devuelve unResult
?- 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 alock()
en una exclusión mutua envenenada da el errorPoisonError
. Puedes llamar ainto_inner()
en el error para recuperar los datos de todos modos.
- Si el hilo que contiene