面试题答案
一键面试在Rust中,可以使用Arc
(原子引用计数)和Mutex
(互斥锁)来确保多个线程安全地访问共享数据。Arc
用于在多个线程间共享数据,Mutex
用于保证同一时间只有一个线程能访问数据。
以下是一个简单的代码示例:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 定义共享数据
let shared_data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
// 克隆Arc,使每个线程都持有一个对共享数据的引用
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
// 锁定Mutex以访问数据
let mut num = data.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
// 打印最终结果
println!("Final value: {}", *shared_data.lock().unwrap());
}
在这个示例中:
Arc<Mutex<i32>>
用于创建一个可以在多个线程间共享的、受互斥锁保护的整数。Arc::clone
用于复制Arc
,使得每个线程都能持有对共享数据的引用。data.lock().unwrap()
用于获取锁,从而安全地访问和修改共享数据。由于lock
可能会失败(例如在死锁的情况下),这里使用了unwrap
简单处理错误。在实际应用中,应该更妥善地处理可能的错误。- 最后,主线程等待所有线程完成,并打印最终的共享数据值。
常函数方面,在这个场景中,虽然没有显式定义常函数,但Mutex
和Arc
的设计保证了在多线程环境下数据访问的安全性,即使在涉及修改数据的操作时也能确保线程安全。如果只是读取数据,可以使用RwLock
替代Mutex
,允许多个线程同时读取数据,提高并发性能。示例如下:
use std::sync::{Arc, RwLock};
use std::thread;
fn main() {
let shared_data = Arc::new(RwLock::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
let num = data.read().unwrap();
println!("Read value: {}", num);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
在这个示例中,RwLock
的read
方法用于获取读锁,允许多个线程同时读取数据,保证了数据的安全访问。