面试题答案
一键面试静态变量内存分配
在Rust中,静态变量的内存分配是在编译时确定的,它们存储在程序的静态存储区。这意味着其内存生命周期贯穿整个程序的执行过程,在程序启动时被分配,在程序结束时被释放。
多线程环境下访问静态变量注意事项
在多线程环境下访问静态变量需要特别小心,因为多个线程可能同时尝试访问和修改静态变量,这会导致数据竞争。为了避免数据竞争,Rust要求在多线程环境下访问静态变量时,静态变量必须是Sync
的,并且通常需要使用线程安全的类型来包装静态变量,如Mutex
(互斥锁)或RwLock
(读写锁)。
代码示例
use std::sync::{Mutex, Arc};
use std::thread;
// 定义一个线程安全的静态变量
static mut COUNTER: u32 = 0;
static COUNTER_LOCK: Mutex<u32> = Mutex::new(0);
fn main() {
let mut handles = vec![];
let counter = Arc::new(COUNTER_LOCK);
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
println!("线程更新后的计数器: {}", num);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
// 不安全的静态变量访问示例(通常应避免)
unsafe {
println!("不安全访问的计数器: {}", COUNTER);
}
}
在上述代码中,COUNTER_LOCK
是使用 Mutex
包装的静态变量,多个线程通过获取锁来安全地更新这个静态变量。同时也展示了不安全的静态变量访问方式(通常不推荐,因为容易导致数据竞争)。