面试题答案
一键面试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();
}
}