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