MST

星途 面试题库

面试题:Rust中如何通过原子操作实现延迟一次性初始化

请简述在Rust中利用原子操作来达成延迟一次性初始化的基本思路,并给出一个简单的代码示例,涉及到`std::sync::atomic`相关类型的使用。
24.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

基本思路

  1. 使用std::sync::atomic::AtomicBool来标记资源是否已经初始化。
  2. 使用std::sync::atomic::AtomicPtr来存储初始化后的资源指针(如果资源是复杂类型),或者直接使用std::sync::atomic::Atomic<T>(如果T实现了SyncCopy)来存储资源本身。
  3. 在初始化逻辑中,首先检查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函数模拟了实际的初始化逻辑。