如何在 Rust 中创建全局可变的 singleton?
你好!我正在学习 Rust,并尝试创建一个全局变量,可以从程序的任何部分访问并且可以修改。例如,我需要存储应用程序的配置,该配置在启动时加载一次,之后可以更新。
在 C++ 或 Python 中,我只需创建一个全局变量,但在 Rust 中编译器会报错。以下是我尝试过的:
```rust
static CONFIG: Vec = Vec::new(); // 错误:缺少生命周期
```
然后我尝试了 `static mut`:
```rust
static mut COUNTER: i32 = 0;
fn increment() {
unsafe {
COUNTER += 1;
}
}
```
这可以工作,但有人告诉我 `static mut` 是不安全的,可能导致数据竞争。我听说过 `Mutex`、`OnceCell` 和 `lazy_static`,但不知道如何正确组合它们。
我需要:
- 在程序启动时一次性初始化全局变量
- 从多个线程读取它
- 偶尔修改它(但不能同时从不同线程修改)
如何正确实现?