Структура 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::source
  • provide() (экспериментальный) - предоставляет доступ к контексту на основе типа

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)

Стандартные реализации

  • Any
  • Borrow<T>
  • BorrowMut<T>
  • From<T>
  • Into<U>
  • ToString
  • TryFrom<U>
  • TryInto<U>