面试题答案
一键面试-
思路:
- 使用
std::sync::Once
结构体来确保初始化只执行一次。Once
类型提供了call_once
方法,它会在线程安全的情况下执行初始化闭包,且只会执行一次。 - 对于需要延迟初始化的全局变量,将其类型定义为
std::sync::Arc
包裹的目标类型。Arc
是原子引用计数,适合多线程环境下共享数据。
- 使用
-
关键代码片段:
use std::sync::{Arc, Once};
static INIT: Once = Once::new();
static mut GLOBAL_VARIABLE: Option<Arc<i32>> = None;
fn get_global_variable() -> Arc<i32> {
unsafe {
INIT.call_once(|| {
GLOBAL_VARIABLE = Some(Arc::new(42));
});
GLOBAL_VARIABLE.as_ref().unwrap().clone()
}
}
在上述代码中:
- 首先定义了一个
Once
类型的静态变量INIT
,用于控制初始化过程。 GLOBAL_VARIABLE
是一个Option<Arc<i32>>
类型的静态变量,初始值为None
。这里使用Option
是因为在初始化前,变量是不存在的。使用Arc
包裹i32
是为了在多线程环境下安全地共享i32
数据。get_global_variable
函数中,通过INIT.call_once
方法来执行初始化闭包,闭包中给GLOBAL_VARIABLE
赋值。call_once
保证了闭包只会被执行一次,即使多个线程同时调用get_global_variable
函数。最后返回GLOBAL_VARIABLE
中的Arc<i32>
的克隆,确保调用者能得到有效的共享数据。需要注意的是,这里使用了unsafe
块,因为直接访问和修改静态可变变量GLOBAL_VARIABLE
需要unsafe
操作。