Spec-Zone.ru › Tokio

Структура OwnedMutexGuard

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

Владеющий дескриптор захваченного Mutex.

Этот объект блокировки доступен только для Mutex, обернутого в Arc. Он идентичен MutexGuard, за исключением того, что вместо заимствования Mutex он клонирует Arc, увеличивая счетчик ссылок. Это означает, что, в отличие от MutexGuard, время его жизни будет 'static.

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

Блокировка автоматически снимается при уничтожении объекта блокировки, после чего lock снова сможет выполниться.

Реализации

impl<T: ?Sized> OwnedMutexGuard<T>

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

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

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

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

Примеры
use tokio::sync::{Mutex, OwnedMutexGuard};
use std::sync::Arc;

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

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

{
    let mut mapped = OwnedMutexGuard::map(foo.clone().lock_owned().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<OwnedMappedMutexGuard<T, U>, Self>
where U: ?Sized, F: FnOnce(&mut T) -> Option<&mut U>,

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

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

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

Примеры
use tokio::sync::{Mutex, OwnedMutexGuard};
use std::sync::Arc;

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

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

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

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

pub fn mutex(this: &Self) -> &Arc<Mutex<T>> ⓘ

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

use std::sync::Arc;
use tokio::sync::{Mutex, OwnedMutexGuard};

async fn unlock_and_relock(guard: OwnedMutexGuard<u32>) -> OwnedMutexGuard<u32> {
    println!("1. contains: {:?}", *guard);
    let mutex: Arc<Mutex<u32>> = OwnedMutexGuard::mutex(&guard).clone();
    drop(guard);
    let guard = mutex.lock_owned().await;
    println!("2. contains: {:?}", *guard);
    guard
}

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

impl<T: ?Sized + Debug> Debug for OwnedMutexGuard<T>

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

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

impl<T: ?Sized> Deref for OwnedMutexGuard<T>

type Target = T

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

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

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

impl<T: ?Sized> DerefMut for OwnedMutexGuard<T>

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

Разыменовывает значение с возможностью его изменения.

impl<T: ?Sized + Display> Display for OwnedMutexGuard<T>

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

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

impl<T: ?Sized> Drop for OwnedMutexGuard<T>

fn drop(&mut self)

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

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

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

impl<T> Sync for OwnedMutexGuard<T>
where T: ?Sized + Send + Sync,

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

impl<T> !RefUnwindSafe for OwnedMutexGuard<T>

impl<T> !UnwindSafe for OwnedMutexGuard<T>

impl<T> Freeze for OwnedMutexGuard<T>
where T: ?Sized,

impl<T> Send for OwnedMutexGuard<T>
where T: Send + ?Sized,

impl<T> Unpin for OwnedMutexGuard<T>
where T: ?Sized,

impl<T> UnsafeUnpin for OwnedMutexGuard<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.OwnedMutexGuard.html

Spec-Zone.ru

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