MST

星途 面试题库

面试题:Rust中读写锁在缓存场景的应用

在一个简单的缓存系统中,多个线程可能会频繁读取缓存数据,偶尔有线程需要更新缓存。请用Rust代码实现一个基于读写锁的缓存结构,要求提供读取和写入方法,简要说明读写锁在此场景中的作用。
40.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::sync::{Arc, RwLock};

struct Cache<T> {
    data: RwLock<T>,
}

impl<T> Cache<T> {
    fn new(data: T) -> Self {
        Cache {
            data: RwLock::new(data),
        }
    }

    fn read(&self) -> Option<T> {
        let guard = self.data.read().ok()?;
        Some(guard.clone())
    }

    fn write(&self, new_data: T) {
        let mut guard = self.data.write().ok()?;
        *guard = new_data;
    }
}

读写锁在此场景中的作用:

  • 读锁:当多个线程同时读取缓存数据时,它们可以同时获取读锁。读锁允许多个线程并发读取数据,因为读取操作不会修改数据,所以不会产生数据竞争问题。这大大提高了系统在高并发读场景下的性能。
  • 写锁:当有线程需要更新缓存数据时,必须获取写锁。写锁是排他的,即同一时间只有一个线程可以持有写锁。这确保了在更新数据时,没有其他线程可以读取或写入数据,从而保证了数据的一致性和完整性。在写入完成后,写锁被释放,其他线程可以再次获取读锁或写锁。