MST

星途 面试题库

面试题:Rust中静态变量的内存分配及访问规则

在Rust中,简述静态变量是如何进行内存分配的,并且说明在多线程环境下访问静态变量需要注意什么,给出相应的代码示例。
30.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

静态变量内存分配

在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 包装的静态变量,多个线程通过获取锁来安全地更新这个静态变量。同时也展示了不安全的静态变量访问方式(通常不推荐,因为容易导致数据竞争)。