Drop-охранники
Охранник освобождения (drop guard) в Rust — это временный объект, который выполняет некоторую очистку, когда выходит из области видимости. В случае Mutex метод lock возвращает MutexGuard, который автоматически разблокирует мьютекс при drop:
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
struct Mutex {
is_locked: bool,
}
struct MutexGuard<'a> {
mutex: &'a mut Mutex,
}
impl Mutex {
fn new() -> Self {
Self { is_locked: false }
}
fn lock(&mut self) -> MutexGuard<'_> {
self.is_locked = true;
MutexGuard { mutex: self }
}
}
impl Drop for MutexGuard<'_> {
fn drop(&mut self) {
self.mutex.is_locked = false;
}
}
-
Пример выше показывает упрощённый
Mutexи связанный с ним охранник. -
Хотя это не промышленная реализация, она иллюстрирует основную идею:
- охранник представляет эксклюзивный доступ,
- а его реализация
Dropосвобождает блокировку, когда тот выходит из области видимости.
Для дальнейшего изучения
Этот пример показывает мьютекс в стиле C++, который не содержит защищаемые им данные. Хотя это неидиоматично для Rust, цель здесь только проиллюстрировать основную идею охранника освобождения, а не показать правильный дизайн мьютекса в Rust.
Для краткости опущено несколько возможностей:
- Реальный
Mutex<T>хранит защищаемое значение внутри мьютекса. Этот упрощённый пример полностью опускает значение, чтобы сосредоточиться только на механизме охранника освобождения. - Удобный доступ через
DerefиDerefMutуMutexGuard(позволяющий охраннику вести себя как&Tили&mut T). - Полностью блокирующий метод
.lock()и неблокирующий вариантtry_lock.
Можно изучить реализацию Mutex в стандартной библиотеке Rust как пример промышленной реализации мьютекса. Ещё один полезный источник — Mutex из крейта parking_lot.