Spec-Zone.ru › Tokio

Структура RwLockWriteGuard

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

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

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

Реализации

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

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

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

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

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

Это асинхронная версия RwLockWriteGuard::map из crate parking_lot.

Примеры
use tokio::sync::{RwLock, RwLockWriteGuard};

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

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

{
    let mut mapped = RwLockWriteGuard::map(lock.write().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) -> RwLockReadGuard<'a, U>
where F: FnOnce(&T) -> &U,

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

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

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

Это эквивалент комбинации асинхронных RwLockWriteGuard::map и RwLockWriteGuard::downgrade из crate parking_lot.

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

Примеры
use tokio::sync::{RwLock, RwLockWriteGuard};

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

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

let mapped = RwLockWriteGuard::downgrade_map(lock.write().await, |f| &f.0);
let foo = lock.read().await;
assert_eq!(foo.0, *mapped);

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

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

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

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

Это асинхронная версия RwLockWriteGuard::try_map из crate parking_lot.

Примеры
use tokio::sync::{RwLock, RwLockWriteGuard};

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

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

{
    let guard = lock.write().await;
    let mut guard = RwLockWriteGuard::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<RwLockReadGuard<'a, U>, Self>
where F: FnOnce(&T) -> Option<&U>,

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

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

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

Это эквивалентно сочетанию асинхронных RwLockWriteGuard::try_map и RwLockWriteGuard::downgrade из крейта parking_lot.

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

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

Примеры
use tokio::sync::{RwLock, RwLockWriteGuard};

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

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

let guard = RwLockWriteGuard::try_downgrade_map(lock.write().await, |f| Some(&f.0)).expect("should not fail");
let foo = lock.read().await;
assert_eq!(foo.0, *guard);

pub fn into_mapped(this: Self) -> RwLockMappedWriteGuard<'a, T>

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

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

pub fn downgrade(self) -> RwLockReadGuard<'a, T>

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

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

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

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

let n = lock.write().await;

let cloned_lock = lock.clone();
let handle = tokio::spawn(async move {
    *cloned_lock.write().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");

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

impl<'a, T> Debug for RwLockWriteGuard<'a, T>
where T: Debug + ?Sized,

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

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

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

type Target = T

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

fn deref(&self) -> &T

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

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

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

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

impl<'a, T> Display for RwLockWriteGuard<'a, T>
where T: Display + ?Sized,

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

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

impl<'a, T: ?Sized> Drop for RwLockWriteGuard<'a, T>

fn drop(&mut self)

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

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

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

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

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

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

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

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

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

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

impl<'a, T> UnsafeUnpin for RwLockWriteGuard<'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, доступный только в ночной сборке. (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.RwLockWriteGuard.html

Spec-Zone.ru

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