Struct std::sync::PoisonError
1.0.0 · source · pub struct PoisonError<T> { /* private fields */ }
Expand description
一种错误类型,每当获取锁时都可以返回该错误。
每当持有锁的线程发生故障时,Mutex
和 RwLock
都会中毒。
锁中毒的确切语义记录在每个锁上,但是一旦锁中毒,则所有 future 获取都将返回此错误。
Examples
use std::sync::{Arc, Mutex};
use std::thread;
let mutex = Arc::new(Mutex::new(1));
// 互斥锁中毒
let c_mutex = Arc::clone(&mutex);
let _ = thread::spawn(move || {
let mut data = c_mutex.lock().unwrap();
*data = 2;
panic!();
}).join();
match mutex.lock() {
Ok(_) => unreachable!(),
Err(p_err) => {
let data = p_err.get_ref();
println!("recovered: {data}");
}
};
RunImplementations§
source§impl<T> PoisonError<T>
impl<T> PoisonError<T>
1.2.0 · sourcepub fn new(guard: T) -> PoisonError<T>
pub fn new(guard: T) -> PoisonError<T>
创建一个 PoisonError
。
这通常是由 Mutex::lock
或 RwLock::read
之类的方法创建的。
1.2.0 · sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
消耗这个错误指示锁已中毒,无论如何都将返回底层防护以允许访问。
Examples
use std::collections::HashSet;
use std::sync::{Arc, Mutex};
use std::thread;
let mutex = Arc::new(Mutex::new(HashSet::new()));
// 互斥锁中毒
let c_mutex = Arc::clone(&mutex);
let _ = thread::spawn(move || {
let mut data = c_mutex.lock().unwrap();
data.insert(10);
panic!();
}).join();
let p_err = mutex.lock().unwrap_err();
let data = p_err.into_inner();
println!("recovered {} items", data.len());
RunTrait Implementations§
source§impl<T> Debug for PoisonError<T>
impl<T> Debug for PoisonError<T>
source§impl<T> Display for PoisonError<T>
impl<T> Display for PoisonError<T>
source§impl<T> Error for PoisonError<T>
impl<T> Error for PoisonError<T>
source§impl<T> From<PoisonError<T>> for TryLockError<T>
impl<T> From<PoisonError<T>> for TryLockError<T>
source§fn from(err: PoisonError<T>) -> TryLockError<T>
fn from(err: PoisonError<T>) -> TryLockError<T>
从输入类型转换为此类型。
Auto Trait Implementations§
impl<T> RefUnwindSafe for PoisonError<T>where T: RefUnwindSafe,
impl<T> Send for PoisonError<T>where T: Send,
impl<T> Sync for PoisonError<T>where T: Sync,
impl<T> Unpin for PoisonError<T>where T: Unpin,
impl<T> UnwindSafe for PoisonError<T>where T: UnwindSafe,
Blanket Implementations§
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
从拥有的值中借用。 Read more