面试题答案
一键面试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
处理中毒错误)获取到锁,读取到的数据也可能是不完整或不正确的,从而影响程序的正确性。