Mutex и MutexGuard
В предыдущих примерах RAII использовался для управления конкретными ресурсами, такими как дескрипторы файлов. С Mutex «ресурс» — это изменяемый доступ к значению. Вы получаете доступ к значению, вызывая lock, который возвращает MutexGuard, автоматически разблокирующий Mutex при освобождении.
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::sync::Mutex;
fn main() {
let m = Mutex::new(vec![1, 2, 3]);
let mut guard = m.lock().unwrap();
guard.push(4);
guard.push(5);
println!("{guard:?}");
}
-
Mutexуправляет эксклюзивным доступом к значению. В отличие от предыдущих примеров RAII, здесь ресурс логический: временный эксклюзивный доступ к данным внутри. -
Это право представлено
MutexGuard. Одновременно может существовать только один охранник для данного мьютекса. Пока он существует, он предоставляет доступ&mut T. -
Хотя
lock()принимает&self, он возвращаетMutexGuardс изменяемым доступом. Это работает через внутреннюю изменяемость, при которой тип сам управляет правилами заимствования внутри, чтобы позволить изменение через&self. -
MutexGuardреализуетDerefиDerefMut, что делает доступ удобным. Вы блокируете мьютекс и используете охранника как&mut T. -
Мьютекс освобождается через
MutexGuard::drop(). Вы никогда не вызываете явную функцию разблокировки.