gpt4 book ai didi

rust - 如何从Arc中包装的Hashmap和Rust中的Mutex返回对值的引用?

转载 作者:行者123 更新时间:2023-12-03 11:34:54 24 4
gpt4 key购买 nike

我在返回HashMap<String,String>中的值的引用时遇到了一些麻烦,该代码由Arc和Mutex包装以在线程之间共享。代码是这样的:


use std::sync::{Arc,Mutex};
use std::collections::HashMap;

struct Hey{
a:Arc<Mutex<HashMap<String, String>>>
}


impl Hey {
fn get(&self,key:&String)->&String{
self.a.lock().unwrap().get(key).unwrap()
}
}

如上所示,由于 returns a value referencing data owned by the current function,代码无法编译。我知道 lock()返回的是MutexGuard,这是一个局部变量。但是,我如何实现这种方法来引用HashMap中的值。如果我做不到,Rust禁止这样做的动机是什么?

最佳答案

让我解释一下为什么rustc认为您的代码是错误的。

  • 只有在锁定互斥时,您才能与Mutex保护的值进行交互。
  • 由RAII后卫处理的锁。

  • 因此,我将您的代码解压缩:
    fn get(&self,key:&String)->&String{
    let lock = self.a.lock().unwrap();
    let reference = lock.get(key).unwrap();
    drop(lock); // release your lock
    // We return reference to data which doesn't protected by Mutex!
    // Someone can delete item from hashmap and you would read deleted data
    // Use-After-Free is UB so rustc forbid that
    return reference;
    }
    可能您需要使用 Arcs作为值:
    #[derive(Default)]
    struct Hey{
    a:Arc<RwLock<HashMap<String, Arc<String>>>>
    }
    fn get(&self,key:&String)->Arc<String>{
    self.a.lock().unwrap().get(key).unwrap().clone()
    }
    P.S.
    另外,您可以使用 Arc<str>(我建议这样做),这可以避免额外的指针间接操作。可以从字符串: let arc: Arc<str> = my_string.into();Arc::from(my_string)构建

    关于rust - 如何从Arc中包装的Hashmap和Rust中的Mutex返回对值的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65434252/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com