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