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

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(). Вы никогда не вызываете явную функцию разблокировки.