Mutex
Mutex<T> garante exclusão mútua e permite acesso mutável a T por trás de uma interface somente de leitura (outra forma de mutabilidade interna):
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.
This slide should take about 14 minutes.
Mutexem 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 Tde um&Mutex<T>obtendo um lock. OMutexGuardgarante que o&mut Tnão sobrevive além do lock obtido. Mutex<T>implementa ambosSendeSyncsse (se e somente se)TimplementaSend.- Um lock para leitura e gravação:
RwLock. - Por que
lock()retorna umResult?- Se o thread que manteve o
Mutexentrou em pânico, oMutextorna-se “envenenado” para sinalizar que os dados protegidos podem estar em um estado inconsistente. Chamarlock()em um mutex envenenado falha com umPoisonError. Você pode chamarinto_inner()no erro para recuperar os dados de qualquer maneira.
- Se o thread que manteve o