pub struct OwnedMutexGuard<T: ?Sized> { /* private fields */ }展开描述
持有的 的 owned 句柄。Mutex
此 guard
仅在
包装的
Arc
中可用。
它与
Mutex
相同,
只是
它
克隆
MutexGuard,
增加引用计数,
而不是
借用
Arc。
这意味着
与
Mutex
不同,
它将具有
MutexGuard
生命周期。'static
只要你持有
此 guard,
就拥有
对底层
的独占访问权。
guard 内部
保留
指向
原始
T
的
引用计数指针,
因此
即使
Mutexlock
被丢弃,
guard 仍然有效。
无论
guard
何时
被丢弃,
lock
都会
自动释放,
此时
将
再次成功。lock
实现§
Source§impl<T: ?Sized> OwnedMutexGuard<T>
impl<T: ?Sized> OwnedMutexGuard<T>
Sourcepub fn map<U, F>(this: Self, f: F) -> OwnedMappedMutexGuard<T, U>
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);Sourcepub fn try_map<U, F>(
this: Self,
f: F,
) -> Result<OwnedMappedMutexGuard<T, U>, Self>
pub fn try_map<U, F>( this: Self, f: F, ) -> Result<OwnedMappedMutexGuard<T, U>, Self>
尝试为已锁定数据的一个组件创建一个新的 。如果闭包返回 OwnedMappedMutexGuard,则返回原始 guard。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);Sourcepub fn mutex(this: &Self) -> &Arc<Mutex<T>>
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
}Trait 实现§
Source§impl<T: ?Sized> Deref for OwnedMutexGuard<T>
impl<T: ?Sized> Deref for OwnedMutexGuard<T>
Source§impl<T: ?Sized> DerefMut for OwnedMutexGuard<T>
impl<T: ?Sized> DerefMut for OwnedMutexGuard<T>
impl<T> Sync for OwnedMutexGuard<T>
自动 Trait 实现§
impl<T> Freeze for OwnedMutexGuard<T>where
T: ?Sized,
impl<T> !RefUnwindSafe for OwnedMutexGuard<T>
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> !UnwindSafe for OwnedMutexGuard<T>
Blanket 实现§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. 更多信息