Структура Owned Mutex Guard
pub struct OwnedMutexGuard<T: ?Sized> { /* private fields */ }
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>
Создает новый 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>
Пытается создать новый 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>
impl<T: ?Sized> Deref for OwnedMutexGuard<T>
impl<T: ?Sized> DerefMut for OwnedMutexGuard<T>
impl<T: ?Sized + Display> Display for OwnedMutexGuard<T>
impl<T: ?Sized> Drop for OwnedMutexGuard<T>
impl<T> Sync for OwnedMutexGuard<T>
Реализации автоматических трейтов
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>
impl<T> Unpin for OwnedMutexGuard<T>where T: ?Sized,
impl<T> UnsafeUnpin for OwnedMutexGuard<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.OwnedMutexGuard.html