MST

星途 面试题库

面试题:Rust中const与static在并发编程中的特性与应用

在Rust的并发编程场景下,const和static关键字声明的变量在使用时有哪些需要特别注意的地方?请详细说明它们在跨线程访问时的特性,并给出具体代码示例,说明如何保证线程安全。
32.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

const声明变量注意点

  1. 常量特性const声明的常量是编译期确定的值,它的类型必须是Copy类型(因为其值在编译期确定,无法在运行时动态变化)。
  2. 跨线程访问:由于常量在编译期就确定,且存储在只读数据段,所以可以安全地跨线程访问,无需额外的线程安全措施。

示例代码:

const MY_CONST: i32 = 42;

fn main() {
    std::thread::spawn(|| {
        println!("Thread accessing const: {}", MY_CONST);
    }).join().unwrap();
    println!("Main thread accessing const: {}", MY_CONST);
}

static声明变量注意点

  1. 静态变量特性static声明的静态变量在程序整个生命周期存在,存储在静态存储区。它可以是任何'static生命周期的类型,不一定是Copy类型。
  2. 跨线程访问:默认情况下,static变量不是线程安全的。如果要跨线程访问,需要使用线程安全的类型包裹,如MutexRwLock等。

示例代码(使用Mutex保证线程安全):

use std::sync::{Mutex, Arc};
static mut MY_STATIC: i32 = 0;

fn main() {
    let shared_static = Arc::new(Mutex::new(MY_STATIC));
    let handles = (0..10).map(|_| {
        let shared_static = shared_static.clone();
        std::thread::spawn(move || {
            let mut data = shared_static.lock().unwrap();
            *data += 1;
            println!("Thread incremented static: {}", *data);
        })
    }).collect::<Vec<_>>();

    for handle in handles {
        handle.join().unwrap();
    }
    let data = shared_static.lock().unwrap();
    println!("Final value of static: {}", *data);
}

总结:const常量由于编译期确定且只读,可直接跨线程安全访问;static静态变量若要跨线程访问,需使用线程安全类型包裹以保证线程安全。