无法借用取消引用“std::sync::RwLockReadGuard<'_, LruCache<i32, bytes::Bytes>>”的数据作为可变数据

Cannot borrow data in dereference of `std::sync::RwLockReadGuard<'_, LruCache<i32, bytes::Bytes>>` as mutable

提问人:zdh5 提问时间:8/10/2022 更新时间:8/10/2022 访问量:1212

问:

我对 Rust 很陌生。为了安全起见,我正在尝试使用 lru::LruCache 和 RwLock 构建全局缓存。它需要根据我的程序的架构在全球范围内访问。

//Size to take up 5MB
const CACHE_ENTRIES: usize = (GIBYTE as usize/ 200) / (BLOCK_SIZE);

pub type CacheEntry = LruCache<i32, Bytes>;
static mut CACHE : CacheEntry = LruCache::new(CACHE_ENTRIES);
lazy_static!{
    static ref BLOCKCACHE: RwLock<CacheEntry> = RwLock::new(CACHE);
}


//this gets called from another setup function
async fn download_block(&self,
        context: &BlockContext,
        buf: &mut [u8],
        count: u32, //bytes to read
        offset: u64,
        buf_index: u32
    ) -> Result<u32> {

    let block_index = context.block_index;

    let block_data : Bytes = match {BLOCKCACHE.read().unwrap().get(&block_index)} {
        Some(data) => data.to_owned(),
        None => download_block_from_remote(context).await.unwrap().to_owned(),
    };

//the rest of the function does stuff with the block_data
}

async fn download_block_from_remote(context: &BlockContext) -> Result<Bytes>{
    //code to download block data from remote into block_data

    {BLOCKCACHE.write().unwrap().put(block_index, block_data.clone())};
    Ok(block_data)
}

现在我在这一行上遇到错误:

let block_data = match {BLOCKCACHE.read().unwrap().get(&block_index)} {

“不能借用可变”大括号内的值。

“帮助:通过取消引用来修改特征是必需的,但未实现DerefMutstd::sync::RwLockReadGuard<'_, LruCache<i32, bytes::Bytes>>"

我还遇到了一些涉及所有权和可变性的其他错误,但我似乎无法摆脱这一点。有没有人能够就如何让它发挥作用提供指导,或者在不可能/可行的情况下让我走上正确的道路?

缓存 可变

评论

0赞 Locke 8/10/2022
您需要使用 来获取对 . 仅提供不可变的访问权限。.write()RwLock.read()
0赞 Finomnis 8/10/2022
不过,@Locke这违背了 的整个目的。我认为他的问题不是我如何获得可写访问权限,而是为什么我在这里需要可写访问权限。RwLock

答:

3赞 Finomnis 8/10/2022 #1

这里的问题是 LruCache::get() 需要对缓存对象的可变访问。(原因:它是一个缓存对象,在查询实际缓存时必须更改其内部状态)

因此,如果使用 ,则需要使用方法而不是方法。RwLockwrite()read()

也就是说,需要可变访问的事实使整个过程变得毫无意义,我会使用普通访问来代替。很少需要使用 an,因为与简单的 .get()RwLockMutexRwLockMutex