面试题答案
一键面试设计思路
- 可变性与所有权:
- 使用
Rust
的&mut
引用访问可变结构体,&
引用访问不可变结构体,以此来控制可变性。 - 对于不可变结构体,可以通过
Copy
或Clone
特性来方便地传递和使用,因为它们不会涉及所有权转移。 - 对于可变结构体,要注意所有权的唯一拥有原则,避免数据竞争。
- 使用
- 多线程并发:
- 使用
std::sync::Mutex
或std::sync::RwLock
来保护可变数据。Mutex
提供独占访问,适用于读写操作频繁且写操作较多的场景;RwLock
允许多个线程同时读,但只允许一个线程写,适用于读操作远多于写操作的场景。 - 对于不可变数据,可以使用
std::sync::Arc
(原子引用计数)来在多线程间共享,因为不可变数据不会引发并发问题。
- 使用
关键代码示例
use std::sync::{Arc, Mutex, RwLock};
use std::thread;
// 不可变结构体
#[derive(Copy, Clone)]
struct ImmutableStruct {
value: i32,
}
// 可变结构体
struct MutableStruct {
data: String,
}
// 复杂数据结构
struct ComplexData {
immutable: ImmutableStruct,
mutable: Mutex<MutableStruct>,
}
fn main() {
let data = Arc::new(ComplexData {
immutable: ImmutableStruct { value: 42 },
mutable: Mutex::new(MutableStruct {
data: "Initial data".to_string(),
}),
});
let data_clone = data.clone();
let handle = thread::spawn(move || {
// 访问不可变数据
let immut = data_clone.immutable;
println!("Immutable value: {}", immut.value);
// 访问可变数据
let mut mut_ref = data_clone.mutable.lock().unwrap();
mut_ref.data = "Modified data".to_string();
});
handle.join().unwrap();
// 主线程访问可变数据
let mut main_mut_ref = data.mutable.lock().unwrap();
println!("Main thread: {}", main_mut_ref.data);
}
在上述代码中:
ImmutableStruct
是不可变结构体,通过Copy
和Clone
特性方便在多线程间使用。MutableStruct
是可变结构体,用Mutex
包裹,确保在多线程环境下的安全访问。ComplexData
结构体包含了不可变和可变部分,Arc
用于在多线程间共享这个复杂数据结构。