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

Иногда тип-токену нужны дополнительные данные. Охранник Mutex — пример токена, который представляет и разрешение, и данные.

// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

use std::sync::{Arc, Mutex, MutexGuard};

fn main() {
    let mutex = Arc::new(Mutex::new(42));
    let try_mutex_guard: Result<MutexGuard<'_, _>, _> = mutex.lock();
    if let Ok(mut guarded) = try_mutex_guard {
        // Полученный MutexGuard — доказательство эксклюзивного доступа.
        *guarded = 451;
    }
}
  • Mutex обеспечивает взаимное исключение при чтении и записи значения. Мы уже рассматривали Mutex ранее в этом курсе (см.: RAII/Mutex), но здесь мы смотрим именно на MutexGuard.

  • MutexGuard — это значение, которое создаёт Mutex и которое доказывает, что в данный момент у вас есть доступ на чтение и запись.

    MutexGuard также хранит ссылку на Mutex, который его создал. Реализации Deref и DerefMut дают доступ к данным Mutex, при этом сам Mutex скрывает эти данные от пользователя.

  • Если mutex.lock() не возвращает MutexGuard, у вас нет разрешения изменять значение внутри мьютекса.

    Мало того что у вас нет разрешения, у вас нет и возможности получить доступ к данным мьютекса, пока вы не получите MutexGuard.

    Это контрастирует с C++, где мьютексы и охранники блокировок не контролируют доступ к самим данным, а служат лишь флагом, который пользователь должен не забывать проверять каждый раз, когда читает или изменяет данные.

  • Продемонстрируйте: сделайте переменную mutex изменяемой, затем попробуйте разыменовать её, чтобы изменить значение. Покажите, что для неё нет реализации Deref и нет других способов добраться до хранящихся в ней данных, кроме получения MutexGuard.