面试题答案
一键面试预防互斥体中毒的基本措施
- 合理处理异常:在获取锁之后的代码块中,尽可能避免恐慌(panic)。如果不可避免,使用
Result
类型来处理可能导致恐慌的操作,将错误返回而不是引发恐慌。 - 使用
MutexGuard
的正确生命周期管理:确保MutexGuard
(通过lock
方法获取的锁的持有者)在其作用域结束时正确释放锁,避免提前丢弃或手动释放。
代码示例
use std::sync::{Arc, Mutex};
fn main() {
let data = Arc::new(Mutex::new(0));
let data_clone = data.clone();
let handle = std::thread::spawn(move || {
let mut guard = data_clone.lock().expect("Failed to lock mutex");
// 这里模拟可能导致恐慌的操作
if *guard < 10 {
// 不使用panic,而是返回错误
return Err(());
}
*guard += 1;
Ok(())
});
match handle.join() {
Ok(result) => match result {
Ok(_) => println!("Thread completed successfully"),
Err(_) => println!("Thread encountered an error"),
},
Err(_) => println!("Thread panicked"),
}
let mut main_guard = data.lock().expect("Failed to lock mutex");
println!("Data in main thread: {}", *main_guard);
}
在上述代码中:
- 线程尝试获取互斥体的锁,并对数据进行操作。
- 通过使用
Result
类型处理可能导致恐慌的情况,避免互斥体中毒。 - 主线程等待线程完成,并处理线程执行过程中的各种结果,确保互斥体的正常使用和数据一致性。