Структура PoisonError<T>
Описание: Тип ошибки, который может возвращаться при получении блокировки.
И Mutex, и RwLock становятся "отравленными" (poisoned), когда поток завершается с ошибкой во время удержания блокировки. Точная семантика отравления блокировки документирована для каждого типа блокировки. Для блокировки в отравленном состоянии, если состояние не очищено вручную, все последующие попытки получения блокировки будут возвращать эту ошибку.
Стабильность: 1.0.0
Примеры
#![allow(unused)] fn main() { 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}"); } }; }
Методы
new (стабильность: 1.2.0)
#![allow(unused)] fn main() { pub fn new(data: T) -> PoisonError<T> }
Создает PoisonError.
Обычно создается методами типа Mutex::lock или RwLock::read.
Доступно только с panic=unwind
into_inner (стабильность: 1.2.0)
#![allow(unused)] fn main() { pub fn into_inner(self) -> T }
Потребляет эту ошибку, указывающую на отравленную блокировку, возвращая связанные данные.
Пример:
#![allow(unused)] fn main() { 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()); }
get_ref (стабильность: 1.2.0)
#![allow(unused)] fn main() { pub fn get_ref(&self) -> &T }
Получает ссылку на связанные данные в этой ошибке, указывающей на отравленную блокировку.
get_mut (стабильность: 1.2.0)
#![allow(unused)] fn main() { pub fn get_mut(&mut self) -> &mut T }
Получает изменяемую ссылку на связанные данные в этой ошибке, указывающей на отравленную блокировку.
Реализации трейтов
Debug (стабильность: 1.0.0)
Реализует форматирование для отладки.
Display (стабильность: 1.0.0)
Реализует форматирование для пользовательского отображения.
Error (стабильность: 1.0.0)
Реализует трейт ошибки.
Методы:
source()(1.30.0) - возвращает низкоуровневый источник ошибкиdescription()(1.0.0, устарел с 1.42.0) - используйте Display impl или to_string()cause()(1.0.0, устарел с 1.33.0) - заменен на Error::sourceprovide()(экспериментальный) - предоставляет доступ к контексту на основе типа
From<PoisonError<T>> for TryLockError<T> (стабильность: 1.0.0)
Преобразует PoisonError<T> в TryLockError<T>.
Автоматические реализации трейтов
Freeze(где T: Freeze)RefUnwindSafe(где T: RefUnwindSafe)Send(где T: Send)Sync(где T: Sync)Unpin(где T: Unpin)UnwindSafe(где T: UnwindSafe)
Стандартные реализации
AnyBorrow<T>BorrowMut<T>From<T>Into<U>ToStringTryFrom<U>TryInto<U>