Struct std::sync::PoisonError 1.0.0[−][src]
pub struct PoisonError<T> { /* fields omitted */ }
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
创建一个 PoisonError
。
这通常是由 Mutex::lock
或 RwLock::read
之类的方法创建的。
消耗这个错误指示锁已中毒,无论如何都将返回底层防护以允许访问。
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());
Run