面试题答案
一键面试Mutex的使用场景
- 多线程环境下共享数据保护:当多个线程需要访问和修改共享数据时,为防止数据竞争(race condition),Mutex可用于保护共享数据,确保同一时间只有一个线程能访问该数据。
- 资源管理:在多线程程序中对一些共享资源(如文件句柄、数据库连接等)的访问控制,避免多个线程同时操作导致资源损坏或不一致。
示例代码
use std::sync::{Mutex, Arc};
use std::thread;
fn main() {
let shared_data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
let mut num = data.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let result = shared_data.lock().unwrap();
println!("Final value: {}", *result);
}
在上述代码中:
- 首先创建了一个
Arc<Mutex<i32>>
类型的共享数据,Arc
用于在多个线程间共享所有权,Mutex
用于保护共享数据。 - 使用
thread::spawn
创建10个线程,每个线程获取Mutex
的锁,对共享数据进行加1操作。 - 主线程等待所有子线程完成后,再次获取锁并打印最终的共享数据值。这样通过
Mutex
有效地保护了共享数据,避免了数据竞争。