Структура MutexGuard

#![allow(unused)]
fn main() {
pub struct MutexGuard<'a, T: ?Sized + 'a> { /* приватные поля */ }
}

Описание

RAII-реализация «блокировки с областью видимости» мьютекса. Когда эта структура удаляется (выходит из области видимости), блокировка будет автоматически снята.

Данные, защищенные мьютексом, могут быть доступны через эту защиту с помощью реализаций Deref и DerefMut.

Эта структура создается методами lock и try_lock у Mutex.

Методы

map

#![allow(unused)]
fn main() {
pub fn map<U, F>(orig: Self, f: F) -> MappedMutexGuard<'a, U>
where
    F: FnOnce(&mut T) -> &mut U,
    U: ?Sized,
}

🔬 Это экспериментальное API только для ночных сборок. (mapped_lock_guards #117108)

Создает MappedMutexGuard для компонента заимствованных данных, например, варианта перечисления.

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

Это ассоциированная функция, которая должна использоваться как MutexGuard::map(...). Метод бы конфликтовал с методами с тем же именем у содержимого MutexGuard, используемого через Deref.

filter_map

#![allow(unused)]
fn main() {
pub fn filter_map<U, F>(
    orig: Self,
    f: F,
) -> Result<MappedMutexGuard<'a, U>, Self>
where
    F: FnOnce(&mut T) -> Option<&mut U>,
    U: ?Sized,
}

🔬 Это экспериментальное API только для ночных сборок. (mapped_lock_guards #117108)

Создает MappedMutexGuard для компонента заимствованных данных. Оригинальная защита возвращается как Err(...), если замыкание возвращает None.

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

Это ассоциированная функция, которая должна использоваться как MutexGuard::filter_map(...). Метод бы конфликтовал с методами с тем же именем у содержимого MutexGuard, используемого через Deref.

Реализации трейтов

Debug

1.16.0

#![allow(unused)]
fn main() {
impl<T: ?Sized + Debug> Debug for MutexGuard<'_, T>
}

fmt

#![allow(unused)]
fn main() {
fn fmt(&self, f: &mut Formatter<'_>) -> Result
}

Форматирует значение с помощью заданного форматировщика.

Deref

1.0.0

#![allow(unused)]
fn main() {
impl<T: ?Sized> Deref for MutexGuard<'_, T>
}

Ассоциированный тип Target

#![allow(unused)]
fn main() {
type Target = T
}

Тип результата после разыменования.

deref

#![allow(unused)]
fn main() {
fn deref(&self) -> &T
}

Разыменовывает значение.

DerefMut

1.0.0

#![allow(unused)]
fn main() {
impl<T: ?Sized> DerefMut for MutexGuard<'_, T>
}

deref_mut

#![allow(unused)]
fn main() {
fn deref_mut(&mut self) -> &mut T
}

Мутабельно разыменовывает значение.

Display

1.20.0

#![allow(unused)]
fn main() {
impl<T: ?Sized + Display> Display for MutexGuard<'_, T>
}

fmt

#![allow(unused)]
fn main() {
fn fmt(&self, f: &mut Formatter<'_>) -> Result
}

Форматирует значение с помощью заданного форматировщика.

Drop

1.0.0

#![allow(unused)]
fn main() {
impl<T: ?Sized> Drop for MutexGuard<'_, T>
}

drop

#![allow(unused)]
fn main() {
fn drop(&mut self)
}

Выполняет деструктор для этого типа.

!Send

1.0.0

#![allow(unused)]
fn main() {
impl<T: ?Sized> !Send for MutexGuard<'_, T>
}

MutexGuard не является Send для максимальной переносимости между платформами.

На платформах, использующих POSIX threads (обычно называемые pthreads), существует требование освобождать блокировки мьютексов в том же потоке, в котором они были получены. По этой причине MutexGuard не должен реализовывать Send, чтобы предотвратить его удаление из другого потока.

Sync

1.19.0

#![allow(unused)]
fn main() {
impl<T: ?Sized + Sync> Sync for MutexGuard<'_, T>
}

T должен быть Sync для того, чтобы MutexGuard<T> был Sync, потому что возможно получить &T из &MutexGuard (через Deref).

Автоматические реализации трейтов

Freeze

#![allow(unused)]
fn main() {
impl<'a, T> Freeze for MutexGuard<'a, T>
where
    T: ?Sized,
}

RefUnwindSafe

#![allow(unused)]
fn main() {
impl<'a, T> RefUnwindSafe for MutexGuard<'a, T>
where
    T: ?Sized,
}

Unpin

#![allow(unused)]
fn main() {
impl<'a, T> Unpin for MutexGuard<'a, T>
where
    T: ?Sized,
}

UnwindSafe

#![allow(unused)]
fn main() {
impl<'a, T> UnwindSafe for MutexGuard<'a, T>
where
    T: ?Sized,
}

Стандартные реализации

(Реализации стандартных трейтов для всех типов остаются без изменений)