MST

星途 面试题库

面试题:Rust中Once保证初始化代码只执行一次的基础应用

请编写一段Rust代码,使用`std::sync::Once`确保某个全局变量只被初始化一次,该全局变量为一个简单的`i32`类型,并在多个线程中进行访问验证只初始化了一次。
30.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::sync::{Once, OnceLock};

static INIT: Once = Once::new();
static mut GLOBAL_VARIABLE: Option<i32> = None;

fn initialize_global_variable() {
    unsafe {
        GLOBAL_VARIABLE = Some(42);
    }
}

fn get_global_variable() -> i32 {
    INIT.call_once(initialize_global_variable);
    unsafe {
        GLOBAL_VARIABLE.unwrap()
    }
}

fn main() {
    let num_threads = 10;
    let mut handles = Vec::new();

    for _ in 0..num_threads {
        let handle = std::thread::spawn(|| {
            let value = get_global_variable();
            println!("Thread got value: {}", value);
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }
}

也可以使用OnceLock来实现:

use std::sync::{OnceLock};

static GLOBAL_VARIABLE: OnceLock<i32> = OnceLock::new();

fn initialize_global_variable() -> i32 {
    42
}

fn get_global_variable() -> i32 {
    GLOBAL_VARIABLE.get_or_init(initialize_global_variable)
}

fn main() {
    let num_threads = 10;
    let mut handles = Vec::new();

    for _ in 0..num_threads {
        let handle = std::thread::spawn(|| {
            let value = get_global_variable();
            println!("Thread got value: {}", value);
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }
}