面试题答案
一键面试基本思路
- 使用
std::sync::atomic::AtomicBool
来标记资源是否已经初始化。 - 使用
std::sync::atomic::AtomicPtr
来存储初始化后的资源指针(如果资源是复杂类型),或者直接使用std::sync::atomic::Atomic<T>
(如果T
实现了Sync
和Copy
)来存储资源本身。 - 在初始化逻辑中,首先检查
AtomicBool
标记,如果已经初始化则直接返回已有的资源。否则,进行初始化操作,在初始化完成后设置AtomicBool
标记为已初始化。
代码示例
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
static INITIALIZED: AtomicBool = AtomicBool::new(false);
static RESOURCE: AtomicUsize = AtomicUsize::new(0);
fn get_resource() -> usize {
if INITIALIZED.load(Ordering::SeqCst) {
return RESOURCE.load(Ordering::SeqCst);
}
// 模拟复杂的初始化操作
let result = do_init();
RESOURCE.store(result, Ordering::SeqCst);
INITIALIZED.store(true, Ordering::SeqCst);
result
}
fn do_init() -> usize {
// 实际的初始化逻辑
42
}
fn main() {
let value1 = get_resource();
let value2 = get_resource();
assert_eq!(value1, value2);
assert_eq!(value1, 42);
}
在这个示例中,INITIALIZED
用于标记资源是否已经初始化,RESOURCE
用于存储初始化后的资源。get_resource
函数负责延迟初始化,确保资源只被初始化一次。do_init
函数模拟了实际的初始化逻辑。