面试题答案
一键面试常见场景
- 线程恐慌:当持有互斥体锁的线程发生恐慌(panic)时,互斥体就会中毒。因为线程在恐慌时不会正常释放锁,导致其他线程无法再安全地获取该互斥体的锁。
- 未正确释放锁:在获取锁后,由于代码逻辑错误(如提前return等),没有显式调用
drop
来释放锁,也可能导致互斥体中毒。
通用解决思路
- 使用
unwrap_or_else
处理恐慌:在获取互斥体锁时,使用unwrap_or_else
方法,在恐慌发生时进行适当的处理,比如记录日志,而不是让整个程序崩溃。例如:
let data = mutex.lock().unwrap_or_else(|e| {
eprintln!("Mutex poisoned: {:?}", e);
std::process::exit(1);
});
- 确保锁的正确释放:使用RAII(Resource Acquisition Is Initialization)机制,Rust的
MutexGuard
会在其作用域结束时自动释放锁,尽量避免手动管理锁的释放。同时,在编写代码逻辑时,仔细检查是否存在提前退出而未释放锁的情况。