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

2023-08-17 15:50:10 +08:00
 none
场景是想自定义一个结构体 HttpClient 用于请求网络资源,模块内共享这个实例变量,这个变量根据操作会发生变化,第一个想到用 Arc<RefCell>,但有个问题,就是 Arc 变量需要先初始化,而我自定义的 HttpClient 需要根据用户输入的参数来调用 HttpClient::new(...) 来创建实例,这种一般怎么解决?总不能为了初始化给 HttpClient 实现 Default trait 吧?
1025 次点击
所在节点    Rust
6 条回复
PTLin
2023-08-17 20:14:58 +08:00
none
2023-08-18 16:07:33 +08:00
@PTLin 感谢! 这个 state::InitCell 正是我需要的。
PTLin
2023-08-18 16:20:57 +08:00
@none OnceLock 和 InitCell 也没区别呀?
none
2023-08-18 23:52:49 +08:00
@PTLin OnceLock 只能初始化一次,我的需求里 HttpClient 这个实例会根据用户操作重新初始化并覆盖之前的变量,其实用 Arc<Mutex> 也能解决这个问题,只不过 Arc<Mutex> 初始化的时候需要有默认值,不太想 new 一个空的 HttpClient 实例。
PTLin
2023-08-19 08:39:17 +08:00
@none InitCell 也是只能 set 一次呀,你要是说那个 reset 的话你看看代码就知道怎么实现的了。
算了我给你写个你这种情况常用的方法吧: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b9dad8543dc9f982a7485d23a9a69eb1
none
2023-08-19 14:47:32 +08:00
@PTLin 看了 reset 的实现代码有点无语,是我把问题想的复杂了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/966112

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX