Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.