Структура Mutex Guard
pub struct MutexGuard<'a, T: ?Sized> { /* private fields */ }
sync.Дескриптор захваченного Mutex. Страж можно удерживать в любой точке .await, поскольку он является Send.
Пока у вас есть этот страж, вы имеете исключительный доступ к базовому T. Страж внутренне заимствует Mutex, поэтому мьютекс не будет удален, пока существует страж.
Блокировка автоматически снимается при удалении стража, после чего lock снова завершается успешно.
Реализации
impl<'a, T: ?Sized> MutexGuard<'a, T>
pub fn map<U, F>(this: Self, f: F) -> MappedMutexGuard<'a, U>
Создает новый MappedMutexGuard для компонента заблокированных данных.
Эта операция не может завершиться неудачей, поскольку переданный MutexGuard уже заблокировал мьютекс.
Это ассоциированная функция, которую необходимо использовать как MutexGuard::map(...). Метод конфликтовал бы с методами с тем же именем у содержимого заблокированных данных.
Примеры
use tokio::sync::{Mutex, MutexGuard};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Foo(u32);
let foo = Mutex::new(Foo(1));
{
let mut mapped = MutexGuard::map(foo.lock().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<MappedMutexGuard<'a, U>, Self>
Пытается создать новый MappedMutexGuard для компонента заблокированных данных. Если замыкание возвращает None, возвращается исходный страж.
Эта операция не может завершиться неудачей, поскольку переданный MutexGuard уже заблокировал мьютекс.
Это ассоциированная функция, которую необходимо использовать как MutexGuard::try_map(...). Метод конфликтовал бы с методами с тем же именем у содержимого заблокированных данных.
Примеры
use tokio::sync::{Mutex, MutexGuard};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Foo(u32);
let foo = Mutex::new(Foo(1));
{
let mut mapped = MutexGuard::try_map(foo.lock().await, |f| Some(&mut f.0))
.expect("should not fail");
*mapped = 2;
}
assert_eq!(Foo(2), *foo.lock().await);pub fn mutex(this: &Self) -> &'a Mutex<T>
Возвращает ссылку на исходный Mutex.
use tokio::sync::{Mutex, MutexGuard};
async fn unlock_and_relock<'l>(guard: MutexGuard<'l, u32>) -> MutexGuard<'l, u32> {
println!("1. contains: {:?}", *guard);
let mutex = MutexGuard::mutex(&guard);
drop(guard);
let guard = mutex.lock().await;
println!("2. contains: {:?}", *guard);
guard
}Реализации трейтов
impl<T: ?Sized + Debug> Debug for MutexGuard<'_, T>
impl<T: ?Sized> Deref for MutexGuard<'_, T>
impl<T: ?Sized> DerefMut for MutexGuard<'_, T>
impl<T: ?Sized + Display> Display for MutexGuard<'_, T>
impl<T: ?Sized> Drop for MutexGuard<'_, T>
impl<T> Sync for MutexGuard<'_, T>
Реализации автоматических трейтов
impl<'a, T> !RefUnwindSafe for MutexGuard<'a, T>
impl<'a, T> !UnwindSafe for MutexGuard<'a, T>
impl<'a, T> Freeze for MutexGuard<'a, T>where T: ?Sized,
impl<'a, T> Send for MutexGuard<'a, T>
impl<'a, T> Unpin for MutexGuard<'a, T>where T: ?Sized,
impl<'a, T> UnsafeUnpin for MutexGuard<'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.MutexGuard.html