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); } };Run
Implementations
创建一个 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