Типы-токены с данными: охранники 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.