Структура RwLock Write Guard
pub struct RwLockWriteGuard<'a, T: ?Sized> { /* private fields */ }
sync.Реализации
impl<'a, T: ?Sized> RwLockWriteGuard<'a, T>
pub fn map<F, U: ?Sized>(this: Self, f: F) -> RwLockMappedWriteGuard<'a, 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>
Создаёт новый 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>
Пытается создать новый 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>
Пытается создать новый 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>
impl<T: ?Sized> Deref for RwLockWriteGuard<'_, T>
impl<T: ?Sized> DerefMut for RwLockWriteGuard<'_, T>
impl<'a, T> Display for RwLockWriteGuard<'a, T>
impl<'a, T: ?Sized> Drop for RwLockWriteGuard<'a, T>
impl<T> Send for RwLockWriteGuard<'_, T>
impl<T> Sync for RwLockWriteGuard<'_, T>
Реализации автоматических трейтов
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> 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.RwLockWriteGuard.html