MST

星途 面试题库

面试题:Rust中读写锁的读写冲突基础处理

在Rust中,简述读写锁(`RwLock`)是如何处理读操作与写操作之间的冲突的?请举例说明在一个多线程环境下,如何正确使用`RwLock`来保证数据的一致性,假设你有一个共享的`Vec<i32>`。
25.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 读写锁(RwLock)处理冲突的原理
    • RwLock允许多个线程同时进行读操作,因为读操作不会修改数据,所以不会产生数据不一致问题。
    • 当有线程进行写操作时,RwLock会阻止其他任何线程(包括读线程和写线程)访问共享资源,直到写操作完成。这样可以确保写操作时数据的一致性,避免其他线程在数据修改过程中读取到不一致的数据。
  2. 多线程环境下使用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>>>类型的共享VecArc用于在多线程间共享数据,RwLock用于控制读写访问。
  • 在多个读线程中,通过read方法获取读锁,从而可以安全地读取Vec中的数据。
  • 在写线程中,通过write方法获取写锁,获取写锁成功后可以对Vec进行修改操作,保证了数据的一致性。所有线程完成操作后通过join等待所有线程结束。