面试题答案
一键面试释放和获取顺序工作原理
在使用Mutex
保护共享数据的多线程Rust程序中:
- 获取锁:线程通过调用
lock
方法获取Mutex
的锁。如果锁当前可用,线程将获得锁并可以访问被保护的数据;如果锁已被其他线程持有,当前线程将被阻塞,直到锁被释放。 - 释放锁:当线程完成对共享数据的操作后,需要释放锁。这是通过
MutexGuard
结构体自动完成的。MutexGuard
是lock
方法返回的类型,当MutexGuard
离开其作用域(例如函数结束或块结束)时,MutexGuard
的析构函数会自动调用,从而释放锁,允许其他等待的线程获取锁。
示例代码
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个Arc<Mutex<T>>来在多线程间共享数据
let data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data_clone = Arc::clone(&data);
let handle = thread::spawn(move || {
// 获取锁
let mut num = data_clone.lock().unwrap();
*num += 1;
println!("Thread incremented data to: {}", num);
// 当num离开作用域时,锁自动释放
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
// 主线程获取锁并打印最终结果
let final_result = data.lock().unwrap();
println!("Final result: {}", final_result);
}
在这个示例中,多个线程尝试获取Mutex
锁来修改共享数据data
。MutexGuard
确保每个线程在操作完数据后正确释放锁,保证数据的一致性和线程安全。