Spec-Zone.ru › Tokio

Структура MutexGuard

pub struct MutexGuard<'a, T: ?Sized> { /* private fields */ }
Доступно только при включенной функции crate sync.

Дескриптор захваченного Mutex. Страж можно удерживать в любой точке .await, поскольку он является Send.

Пока у вас есть этот страж, вы имеете исключительный доступ к базовому T. Страж внутренне заимствует Mutex, поэтому мьютекс не будет удален, пока существует страж.

Блокировка автоматически снимается при удалении стража, после чего lock снова завершается успешно.

Реализации

impl<'a, T: ?Sized> MutexGuard<'a, T>

pub fn map<U, F>(this: Self, f: F) -> MappedMutexGuard<'a, U>
where U: ?Sized, F: FnOnce(&mut T) -> &mut U,

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

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

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

Примеры
use tokio::sync::{Mutex, MutexGuard};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Foo(u32);

let foo = Mutex::new(Foo(1));

{
    let mut mapped = MutexGuard::map(foo.lock().await, |f| &mut f.0);
    *mapped = 2;
}

assert_eq!(Foo(2), *foo.lock().await);

pub fn try_map<U, F>(this: Self, f: F) -> Result<MappedMutexGuard<'a, U>, Self>
where U: ?Sized, F: FnOnce(&mut T) -> Option<&mut U>,

Пытается создать новый MappedMutexGuard для компонента заблокированных данных. Если замыкание возвращает None, возвращается исходный страж.

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

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

Примеры
use tokio::sync::{Mutex, MutexGuard};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Foo(u32);

let foo = Mutex::new(Foo(1));

{
    let mut mapped = MutexGuard::try_map(foo.lock().await, |f| Some(&mut f.0))
        .expect("should not fail");
    *mapped = 2;
}

assert_eq!(Foo(2), *foo.lock().await);

pub fn mutex(this: &Self) -> &'a Mutex<T>

Возвращает ссылку на исходный Mutex.

use tokio::sync::{Mutex, MutexGuard};

async fn unlock_and_relock<'l>(guard: MutexGuard<'l, u32>) -> MutexGuard<'l, u32> {
    println!("1. contains: {:?}", *guard);
    let mutex = MutexGuard::mutex(&guard);
    drop(guard);
    let guard = mutex.lock().await;
    println!("2. contains: {:?}", *guard);
    guard
}

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

impl<T: ?Sized + Debug> Debug for MutexGuard<'_, T>

fn fmt(&self, f: &mut Formatter<'_>) -> Result

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

impl<T: ?Sized> Deref for MutexGuard<'_, T>

type Target = T

Тип, получаемый после разыменования.

fn deref(&self) -> &Self::Target

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

impl<T: ?Sized> DerefMut for MutexGuard<'_, T>

fn deref_mut(&mut self) -> &mut Self::Target

Изменяемо разыменовывает значение.

impl<T: ?Sized + Display> Display for MutexGuard<'_, T>

fn fmt(&self, f: &mut Formatter<'_>) -> Result

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

impl<T: ?Sized> Drop for MutexGuard<'_, T>

fn drop(&mut self)

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

fn pin_drop(self: Pin<&mut Self>)

🔬Это экспериментальный API, доступный только в nightly-сборке. (pin_ergonomics)
Выполняет деструктор этого типа, но, в отличие от Drop::drop, требует, чтобы self был закреплён. Подробнее

impl<T> Sync for MutexGuard<'_, T>
where T: ?Sized + Send + Sync,

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

impl<'a, T> !RefUnwindSafe for MutexGuard<'a, T>

impl<'a, T> !UnwindSafe for MutexGuard<'a, T>

impl<'a, T> Freeze for MutexGuard<'a, T>
where T: ?Sized,

impl<'a, T> Send for MutexGuard<'a, T>
where T: Send + ?Sized,

impl<'a, T> Unpin for MutexGuard<'a, T>
where T: ?Sized,

impl<'a, T> UnsafeUnpin for MutexGuard<'a, T>
where T: ?Sized,

Общие реализации

impl<T> Any for T
where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

Получает TypeId для self. Подробнее

impl<T> Borrow<T> for T
where T: ?Sized,

fn borrow(&self) -> &T

Неизменяемо заимствует данные из принадлежащего значения. Подробнее

impl<T> BorrowMut<T> for T
where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

Изменяемо заимствует данные из принадлежащего значения. Подробнее

impl<T> From<T> for T

fn from(t: T) -> T

Возвращает аргумент без изменений.

impl<T> Instrument for T

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью указанного Span, возвращая обёртку Instrumented. Подробнее

fn in_current_span(self) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью текущего Span, возвращая обёртку Instrumented. Подробнее

impl<T, U> Into<U> for T
where U: From<T>,

fn into(self) -> U

Вызывает U::from(self).

То есть это преобразование выполняет то, что выберет реализация From<T> for U.

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

type Target = T

🔬Это экспериментальный API, доступный только в nightly. (arbitrary_self_types)
Тип-цель, для которого можно вызвать метод.

impl<T> ToString for T
where T: Display + ?Sized,

fn to_string(&self) -> String

Преобразует указанное значение в String. Подробнее

impl<T, U> TryFrom<U> for T
where U: Into<T>,

type Error = Infallible

Тип, возвращаемый при ошибке преобразования.

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Выполняет преобразование.

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error

Тип, возвращаемый при ошибке преобразования.

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Выполняет преобразование.

impl<T> WithSubscriber for T

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Присоединяет предоставленный Subscriber к этому типу, возвращая обёртку WithDispatch. Подробнее

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Присоединяет текущий по умолчанию Subscriber к этому типу, возвращая обёртку WithDispatch. Подробнее

MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/sync/struct.MutexGuard.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API