提问人:zdh5 提问时间:8/10/2022 更新时间:8/10/2022 访问量:1212
无法借用取消引用“std::sync::RwLockReadGuard<'_, LruCache<i32, bytes::Bytes>>”的数据作为可变数据
Cannot borrow data in dereference of `std::sync::RwLockReadGuard<'_, LruCache<i32, bytes::Bytes>>` as mutable
问:
我对 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)} {
“不能借用可变”大括号内的值。
“帮助:通过取消引用来修改特征是必需的,但未实现DerefMut
std::sync::RwLockReadGuard<'_, LruCache<i32, bytes::Bytes>>
"
我还遇到了一些涉及所有权和可变性的其他错误,但我似乎无法摆脱这一点。有没有人能够就如何让它发挥作用提供指导,或者在不可能/可行的情况下让我走上正确的道路?
答:
3赞
Finomnis
8/10/2022
#1
这里的问题是 LruCache::get()
需要对缓存对象的可变访问。(原因:它是一个缓存对象,在查询实际缓存时必须更改其内部状态)
因此,如果使用 ,则需要使用方法而不是方法。RwLock
write()
read()
也就是说,需要可变访问的事实使整个过程变得毫无意义,我会使用普通访问来代替。很少需要使用 an,因为与简单的 .get()
RwLock
Mutex
RwLock
Mutex
评论
.write()
RwLock
.read()
RwLock