Mutex
Mutex<T> обеспечивает взаимное исключение и позволяет изменять T через интерфейс только для чтения (это ещё одна форма внутренней изменяемости):
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
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());
}
Обратите внимание, что есть blanket-реализация impl<T: Send> Sync for Mutex<T>.
This slide should take about 14 minutes.
Mutexв Rust выглядит как коллекция из одного элемента — защищаемых данных.- Невозможно забыть взять мьютекс перед доступом к защищаемым данным.
- Из
&Mutex<T>можно получить&mut T, взяв блокировку.MutexGuardгарантирует, что&mut Tне переживёт удерживаемую блокировку. Mutex<T>реализует иSend, иSyncтогда и только тогда, когдаTреализуетSend.- Аналог с блокировкой чтения-записи:
RwLock. - Почему
lock()возвращаетResult?- Если поток, который держал
Mutex, запаниковал,Mutexстановится «отравленным» (poisoned), чтобы сигнализировать, что защищаемые данные могут находиться в несогласованном состоянии. Вызовlock()у отравленного мьютекса завершается ошибкойPoisonError. Вы всё равно можете вызватьinto_inner()у ошибки, чтобы восстановить данные.
- Если поток, который держал