面试题答案
一键面试-
创建非作用域互斥体的基本步骤:
- 引入
std::sync::Mutex
模块。在Rust中,Mutex
是标准库提供的用于线程同步的工具,要使用它需要先引入相关模块。 - 使用
Mutex::new
方法创建一个Mutex
实例,将需要保护的数据作为参数传递给new
方法。
- 引入
-
多线程环境下安全访问受互斥体保护的数据示例:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个Mutex,保护一个i32类型的数据
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 || {
// 锁定Mutex,获取内部数据的可变引用
let mut num = data_clone.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
// 主线程中访问受保护的数据
let result = data.lock().unwrap();
println!("Final result: {}", *result);
}
在上述代码中:
- 首先通过
Arc::new(Mutex::new(0))
创建了一个Mutex
实例,保护一个初始值为0的i32
类型数据,并使用Arc
来在多个线程间共享这个Mutex
。 - 然后创建10个线程,每个线程通过
data_clone.lock().unwrap()
来锁定Mutex
,获取内部数据的可变引用,对其进行加1操作。这里lock
方法返回一个Result
,使用unwrap
简单处理错误,如果锁定失败会导致程序崩溃,在实际应用中可以更优雅地处理错误。 - 主线程通过
handle.join()
等待所有线程执行完毕,最后通过data.lock().unwrap()
获取并打印最终结果。