MST

星途 面试题库

面试题:Rust中互斥体中毒问题的常见场景及解决思路

列举至少两个Rust中可能导致互斥体中毒的常见场景,并说明针对这些场景,你所知道的通用解决思路是什么?
40.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

常见场景

  1. 线程恐慌:当持有互斥体锁的线程发生恐慌(panic)时,互斥体就会中毒。因为线程在恐慌时不会正常释放锁,导致其他线程无法再安全地获取该互斥体的锁。
  2. 未正确释放锁:在获取锁后,由于代码逻辑错误(如提前return等),没有显式调用drop来释放锁,也可能导致互斥体中毒。

通用解决思路

  1. 使用unwrap_or_else处理恐慌:在获取互斥体锁时,使用unwrap_or_else方法,在恐慌发生时进行适当的处理,比如记录日志,而不是让整个程序崩溃。例如:
let data = mutex.lock().unwrap_or_else(|e| {
    eprintln!("Mutex poisoned: {:?}", e);
    std::process::exit(1);
});
  1. 确保锁的正确释放:使用RAII(Resource Acquisition Is Initialization)机制,Rust的MutexGuard会在其作用域结束时自动释放锁,尽量避免手动管理锁的释放。同时,在编写代码逻辑时,仔细检查是否存在提前退出而未释放锁的情况。