面试题答案
一键面试在Rust中,可以使用Arc
(原子引用计数)和Mutex
(互斥锁)来解决这个问题。Arc
用于在多个线程间共享数据,Mutex
用于保证同一时间只有一个线程可以访问数据,避免数据竞争。
以下是一个简单的示例:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个可在多线程间共享的数据结构
let data = Arc::new(Mutex::new(vec![1, 2, 3]));
// 创建一个新线程,该线程会引用主线程中的数据
let handle = thread::spawn({
let data = Arc::clone(&data);
move || {
let mut data_guard = data.lock().unwrap();
data_guard.push(4);
println!("子线程中数据: {:?}", data_guard);
}
});
// 主线程等待子线程结束
handle.join().unwrap();
// 主线程仍然可以访问数据
let data_guard = data.lock().unwrap();
println!("主线程中数据: {:?}", data_guard);
}
在上述代码中:
- 使用
Arc<Mutex<T>>
来包装数据结构vec![1, 2, 3]
,使得数据可以在多线程间安全共享。 - 在创建子线程时,通过
Arc::clone
克隆Arc
智能指针,这样子线程和主线程都可以引用相同的数据。 - 在子线程和主线程中,通过
Mutex::lock
方法获取锁,访问完数据后,锁会自动释放。这样就避免了悬空引用和数据竞争问题。