Spec-Zone.ru › Tokio

Структура OwnedRwLockWriteGuard

pub struct OwnedRwLockWriteGuard<T: ?Sized> { /* private fields */ }
Доступно только при включённой возможности крейта crate feature sync.

Владеющая структура RAII, освобождающая эксклюзивный доступ к записи блокировки при удалении.

Эта структура создаётся методом write_owned для RwLock.

Реализации

impl<T: ?Sized> OwnedRwLockWriteGuard<T>

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

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

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

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

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

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

let lock = Arc::new(RwLock::new(Foo(1)));

{
    let lock = Arc::clone(&lock);
    let mut mapped = OwnedRwLockWriteGuard::map(lock.write_owned().await, |f| &mut f.0);
    *mapped = 2;
}

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

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

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

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

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

Внутри f вы сохраняете исключительный доступ к данным, несмотря на то, что вам передан только &T. Предоставление &mut T привело бы к нарушению безопасности, поскольку вы могли бы использовать внутреннюю изменяемость.

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

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

let lock = Arc::new(RwLock::new(Foo(1)));

let guard = Arc::clone(&lock).write_owned().await;
let mapped = OwnedRwLockWriteGuard::downgrade_map(guard, |f| &f.0);
let foo = lock.read_owned().await;
assert_eq!(foo.0, *mapped);

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

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

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

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

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

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

let lock = Arc::new(RwLock::new(Foo(1)));

{
    let guard = Arc::clone(&lock).write_owned().await;
    let mut guard = OwnedRwLockWriteGuard::try_map(guard, |f| Some(&mut f.0)).expect("should not fail");
    *guard = 2;
}

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

pub fn try_downgrade_map<F, U: ?Sized>( this: Self, f: F, ) -> Result<OwnedRwLockReadGuard<T, U>, Self>
where F: FnOnce(&T) -> Option<&U>,

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

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

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

Внутри f вы сохраняете исключительный доступ к данным, несмотря на то, что вам передан только &T. Предоставление &mut T привело бы к нарушению безопасности, поскольку вы могли бы использовать внутреннюю изменяемость.

Если эта функция возвращает Err(...), блокировка не снимается и не понижается.

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

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

let lock = Arc::new(RwLock::new(Foo(1)));

let guard = Arc::clone(&lock).write_owned().await;
let guard = OwnedRwLockWriteGuard::try_downgrade_map(guard, |f| Some(&f.0)).expect("should not fail");
let foo = lock.read_owned().await;
assert_eq!(foo.0, *guard);

pub fn into_mapped(this: Self) -> OwnedRwLockMappedWriteGuard<T>

Преобразует этот OwnedRwLockWriteGuard в OwnedRwLockMappedWriteGuard. Этот метод можно использовать, чтобы сохранить немаппированный guard в поле структуры, которому требуется маппированный guard.

Это эквивалентно вызову OwnedRwLockWriteGuard::map(guard, |me| me).

pub fn downgrade(self) -> OwnedRwLockReadGuard<T>

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

Примечание: Это не обязательно позволит получить блокировку дополнительным читателям, поскольку RwLock обеспечивает справедливый доступ, и следующим в очереди может оказаться поток записи.

Возвращает RAII-guard, который при удалении освобождает этот доступ на чтение к RwLock.

Примеры
let lock = Arc::new(RwLock::new(1));

let n = lock.clone().write_owned().await;

let cloned_lock = lock.clone();
let handle = tokio::spawn(async move {
    *cloned_lock.write_owned().await = 2;
});

let n = n.downgrade();
assert_eq!(*n, 1, "downgrade is atomic");

drop(n);
handle.await.unwrap();
assert_eq!(*lock.read().await, 2, "second writer obtained write lock");

pub fn rwlock(this: &Self) -> &Arc<RwLock<T>> ⓘ

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

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

let lock = Arc::new(RwLock::new(1));

let guard = lock.clone().write_owned().await;
assert!(Arc::ptr_eq(&lock, OwnedRwLockWriteGuard::rwlock(&guard)));

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

impl<T> Debug for OwnedRwLockWriteGuard<T>
where T: Debug + ?Sized,

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

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

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

type Target = T

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

fn deref(&self) -> &T

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

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

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

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

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

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

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

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

fn drop(&mut self)

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

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

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

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

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

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

impl<T> !RefUnwindSafe for OwnedRwLockWriteGuard<T>

impl<T> !UnwindSafe for OwnedRwLockWriteGuard<T>

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

impl<T> Unpin for OwnedRwLockWriteGuard<T>
where T: Unpin + ?Sized,

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

Spec-Zone.ru

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