面试题答案
一键面试- 读写锁(
RwLock
)处理冲突的原理:RwLock
允许多个线程同时进行读操作,因为读操作不会修改数据,所以不会产生数据不一致问题。- 当有线程进行写操作时,
RwLock
会阻止其他任何线程(包括读线程和写线程)访问共享资源,直到写操作完成。这样可以确保写操作时数据的一致性,避免其他线程在数据修改过程中读取到不一致的数据。
- 多线程环境下使用
RwLock
保证数据一致性的示例:
use std::sync::{Arc, RwLock};
use std::thread;
fn main() {
let shared_vec = Arc::new(RwLock::new(vec![1, 2, 3]));
let mut handles = vec![];
// 多个读线程
for _ in 0..3 {
let shared_vec_clone = shared_vec.clone();
let handle = thread::spawn(move || {
let data = shared_vec_clone.read().unwrap();
println!("Read data: {:?}", data);
});
handles.push(handle);
}
// 写线程
let shared_vec_clone = shared_vec.clone();
let write_handle = thread::spawn(move || {
let mut data = shared_vec_clone.write().unwrap();
data.push(4);
println!("Write data: {:?}", data);
});
handles.push(write_handle);
for handle in handles {
handle.join().unwrap();
}
}
在上述代码中:
- 首先创建了一个
Arc<RwLock<Vec<i32>>>
类型的共享Vec
。Arc
用于在多线程间共享数据,RwLock
用于控制读写访问。 - 在多个读线程中,通过
read
方法获取读锁,从而可以安全地读取Vec
中的数据。 - 在写线程中,通过
write
方法获取写锁,获取写锁成功后可以对Vec
进行修改操作,保证了数据的一致性。所有线程完成操作后通过join
等待所有线程结束。