V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
none
V2EX  ›  Rust

关于多线程初始化全局变量的问题

  •  
  •   none · 2023-08-17 15:50:10 +08:00 · 1052 次点击
    这是一个创建于 498 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景是想自定义一个结构体 HttpClient 用于请求网络资源,模块内共享这个实例变量,这个变量根据操作会发生变化,第一个想到用 Arc<RefCell>,但有个问题,就是 Arc 变量需要先初始化,而我自定义的 HttpClient 需要根据用户输入的参数来调用 HttpClient::new(...) 来创建实例,这种一般怎么解决?总不能为了初始化给 HttpClient 实现 Default trait 吧?
    6 条回复    2023-08-19 14:47:32 +08:00
    none
        2
    none  
    OP
       2023-08-18 16:07:33 +08:00
    @PTLin 感谢! 这个 state::InitCell 正是我需要的。
    PTLin
        3
    PTLin  
       2023-08-18 16:20:57 +08:00
    @none OnceLock 和 InitCell 也没区别呀?
    none
        4
    none  
    OP
       2023-08-18 23:52:49 +08:00
    @PTLin OnceLock 只能初始化一次,我的需求里 HttpClient 这个实例会根据用户操作重新初始化并覆盖之前的变量,其实用 Arc<Mutex> 也能解决这个问题,只不过 Arc<Mutex> 初始化的时候需要有默认值,不太想 new 一个空的 HttpClient 实例。
    PTLin
        5
    PTLin  
       2023-08-19 08:39:17 +08:00   ❤️ 1
    @none InitCell 也是只能 set 一次呀,你要是说那个 reset 的话你看看代码就知道怎么实现的了。
    算了我给你写个你这种情况常用的方法吧: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b9dad8543dc9f982a7485d23a9a69eb1
    none
        6
    none  
    OP
       2023-08-19 14:47:32 +08:00
    @PTLin 看了 reset 的实现代码有点无语,是我把问题想的复杂了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1304 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:41 · PVG 01:41 · LAX 09:41 · JFK 12:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.