MST

星途 面试题库

面试题:Rust中互斥体中毒问题的基本概念

请阐述Rust中互斥体中毒(Mutex Poisoning)问题是如何产生的,以及它会对程序造成什么影响?
40.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

1. 互斥体中毒(Mutex Poisoning)产生原因

  • 线程恐慌(Panic):在Rust中,当一个线程获取了互斥体(Mutex)的锁,并在持有锁期间发生了恐慌(panic)时,就会导致互斥体中毒。这是因为恐慌意味着线程异常终止,而该线程持有的锁没有被正确释放。例如:
use std::sync::{Arc, Mutex};

let data = Arc::new(Mutex::new(0));
let data_clone = data.clone();
std::thread::spawn(move || {
    let mut num = data_clone.lock().unwrap();
    *num = 42;
    panic!("Something went wrong!");
});

let result = data.lock();

在上述代码中,新线程获取锁并修改数据后恐慌,使得互斥体进入中毒状态。

2. 对程序的影响

  • 锁不可用:一旦互斥体中毒,后续尝试获取该互斥体锁的操作将失败。例如在上述代码中,主线程data.lock()操作返回的是Err,因为互斥体已经中毒。这意味着其他线程无法再正常访问被该互斥体保护的数据。
  • 数据可能不一致:由于持有锁的线程在恐慌前可能已经对共享数据进行了部分修改,这可能导致共享数据处于不一致的状态。其他线程即使能够通过特殊方式(如使用unwrap_or_else处理中毒错误)获取到锁,读取到的数据也可能是不完整或不正确的,从而影响程序的正确性。