Mutex
Mutex<T>
забезпечує взаємовиключення та дозволяє мутабельний доступ до T
за інтерфейсом лише для читання (інша форма внутрішньої мутабельності):
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()); }
Зверніть увагу, що ми маємо impl<T: Send> Sync for Mutex<T>
загальну реалізацію.
This slide should take about 14 minutes.
Mutex
у Rust виглядає як колекція лише з одним елементом --- захищеними даними.- Неможливо забути отримати м'ютекс перед доступом до захищених даних.
- Ви можете отримати
&mut T
від&Mutex<T>
, взявши блокування.MutexGuard
гарантує, що&mut T
не переживе утримуване блокування. Mutex<T>
реалізує якSend
, так іSync
тоді і тільки тоді колиT
реалізуєSend
.- Аналог блокування читання-запису:
RwLock
. - Чому
lock()
повертаєResult
?- Якщо потік, який утримував
Mutex
, запанікував,Mutex
стає "отруєним", сигналізуючи про те, що дані, які він захищає, можуть перебувати в неузгодженому стані. Викликlock()
для отруєнного м’ютексу зазнає невдачі зPoisonError
. Ви можете викликатиinto_inner()
для помилки, щоб відновити дані незалежно від цього.
- Якщо потік, який утримував