- 使用
lazy_static
和Mutex
:
lazy_static
用于延迟初始化静态变量,Mutex
用于实现线程安全的访问。
- 首先添加依赖:
[dependencies]
lazy_static = "1.4.0"
use lazy_static::lazy_static;
use std::sync::Mutex;
// 定义结构体
struct MyStruct {
// 结构体字段
data: i32,
}
// 定义静态变量
lazy_static! {
static ref MY_CONST: Mutex<MyStruct> = Mutex::new(MyStruct { data: 0 });
}
fn main() {
// 获取锁并访问静态变量
let mut my_const = MY_CONST.lock().unwrap();
my_const.data = 10;
println!("Accessed MY_CONST: {}", my_const.data);
}
- 用到的特性和机制:
lazy_static
特性:
- 延迟初始化静态变量。这意味着静态变量
MY_CONST
在第一次使用时才会被初始化,而不是在程序启动时就初始化。这样可以避免不必要的初始化开销,特别是当静态变量的初始化过程比较复杂或依赖于一些运行时的条件时。
Mutex
机制:
Mutex
(互斥锁)是一种同步原语,它保证在同一时间只有一个线程可以访问被其保护的数据。在这个例子中,Mutex
保护着MY_CONST
这个静态变量。当一个线程想要访问MY_CONST
时,它需要先获取锁(通过lock
方法),如果锁当前可用,线程将获得锁并可以访问数据,访问完后释放锁(通过MutexGuard
离开作用域自动释放)。如果锁当前被其他线程持有,那么请求锁的线程将被阻塞,直到锁被释放。这确保了多线程环境下对MY_CONST
的安全访问,避免数据竞争。