可变的静态变量

读取不可变的静态变量是安全的操作:

static HELLO_WORLD: &str = "Hello, world!";

fn main() {
    println!("HELLO_WORLD: {HELLO_WORLD}");
}

但是,读取和写入可变的静态变量是不安全的,因为这可能会 造成数据争用:

static mut COUNTER: u32 = 0;

fn add_to_counter(inc: u32) {
    // SAFETY: There are no other threads which could be accessing `COUNTER`.
    unsafe {
        COUNTER += inc;
    }
}

fn main() {
    add_to_counter(42);

    // SAFETY: There are no other threads which could be accessing `COUNTER`.
    unsafe {
        println!("COUNTER: {COUNTER}");
    }
}
This slide should take about 5 minutes.
  • 此处的程序是安全的,因为它是单线程的。不过,Rust 编译器比较保守,会做出最坏的假设。请尝试移除 unsafe,看看编译器如何解释从多个线程中修改静态变量是一种未定义的行为。

  • 通常,我们不建议使用可变的静态变量,但在某些情况下,在低层级 no_std 代码中可能需要这样做, 例如实现堆分配器或使用某些 C API。