面试题答案
一键面试整体思路
- 使用
Arc
和Mutex
:由于数据结构是共享的,且需要在多个模块间访问,Arc
(原子引用计数)用于在多个线程间共享数据,Mutex
(互斥锁)用于保证同一时间只有一个线程可以访问数据,从而确保数据一致性。 - 合理管理生命周期:确保引用的生命周期足够长,能覆盖所有需要访问数据的操作,但又不会导致悬垂引用。在模块间传递引用时,要明确声明生命周期参数,使编译器能够正确检查引用的有效性。
关键代码片段示例
use std::sync::{Arc, Mutex};
// 定义共享的数据结构
struct LargeDataStructure {
data: Vec<i32>,
}
impl LargeDataStructure {
fn new() -> Self {
LargeDataStructure { data: Vec::new() }
}
}
// 模块A,负责写入数据
mod module_a {
use super::*;
pub fn write_data(data: &mut LargeDataStructure) {
data.data.push(42);
}
}
// 模块B,负责读取数据
mod module_b {
use super::*;
pub fn read_data(data: &LargeDataStructure) {
println!("Data: {:?}", data.data);
}
}
fn main() {
let shared_data = Arc::new(Mutex::new(LargeDataStructure::new()));
// 克隆Arc,以便在不同模块中使用
let data_clone = shared_data.clone();
std::thread::spawn(move || {
let mut data = data_clone.lock().unwrap();
module_a::write_data(&mut *data);
});
let data_clone = shared_data.clone();
std::thread::spawn(move || {
let data = data_clone.lock().unwrap();
module_b::read_data(&*data);
});
}
在上述代码中:
LargeDataStructure
是共享的数据结构。Arc<Mutex<LargeDataStructure>>
用于在多个线程(这里简单用std::thread::spawn
模拟不同模块操作)间安全共享数据。module_a::write_data
函数获取可变引用进行写入操作,module_b::read_data
函数获取不可变引用进行读取操作。在多线程环境下,通过Mutex
的lock
方法获取锁来保证数据一致性。