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.
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. OMutexGuard
garante que o&mut T
não sobrevive além do lock obtido. Mutex<T>
implementa ambosSend
eSync
sse (se e somente se)T
implementaSend
.- Um lock para leitura e gravação:
RwLock
. - Por que
lock()
retorna umResult
?- Se o thread que manteve o
Mutex
entrou em pânico, oMutex
torna-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