Структура Owned RwLock Write Guard
pub struct OwnedRwLockWriteGuard<T: ?Sized> { /* private fields */ }
sync.Владеющая структура RAII, освобождающая эксклюзивный доступ к записи блокировки при удалении.
Эта структура создаётся методом write_owned для RwLock.
Реализации
impl<T: ?Sized> OwnedRwLockWriteGuard<T>
pub fn map<F, U: ?Sized>(this: Self, f: F) -> OwnedRwLockMappedWriteGuard<T, 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>
Создаёт новый 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>
Пытается создать новый 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>
Пытается создать новый 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>
impl<T: ?Sized> Deref for OwnedRwLockWriteGuard<T>
impl<T: ?Sized> DerefMut for OwnedRwLockWriteGuard<T>
impl<T> Display for OwnedRwLockWriteGuard<T>
impl<T: ?Sized> Drop for OwnedRwLockWriteGuard<T>
impl<T> Send for OwnedRwLockWriteGuard<T>
impl<T> Sync for OwnedRwLockWriteGuard<T>
Автоматические реализации трейтов
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>
impl<T> UnsafeUnpin for OwnedRwLockWriteGuard<T>where T: ?Sized,
Общие реализации
impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<P, T> Receiver for P
type Target = T
arbitrary_self_types)
impl<T> ToString for T
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
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