Mutex

Mutex<T> забезпечує взаємовиключення та дозволяє мутабельний доступ до T за інтерфейсом лише для читання (інша форма внутрішньої мутабельності):

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Зверніть увагу, що ми маємо impl<T: Send> Sync for Mutex<T> загальну реалізацію.

Speaker Notes

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() для помилки, щоб відновити дані незалежно від цього.