Variáveis Estáticas Mutáveis

É seguro ler uma variável estática imutável:

static HELLO_WORLD: &str = "Olá, mundo!";

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

No entanto, como podem ocorrer corridas de dados (data races), não é seguro ler e gravar dados em variáveis estáticas mutáveis:

static mut COUNTER: u32 = 0;

fn add_to_counter(inc: u32) {
    // SEGURANÇA: Não há outras _threads_ que poderiam estar acessando `COUNTER`.
    unsafe {
        COUNTER += inc;
    }
}

fn main() {
    add_to_counter(42);

    // SEGURANÇA: Não há outras _threads_ que poderiam estar acessando `COUNTER`.
    unsafe {
        println!("COUNTER: {COUNTER}");
    }
}
This slide should take about 5 minutes.
  • O programa aqui é seguro porque é single-threaded. No entanto, o compilador Rust é conservador e assumirá o pior. Tente remover o unsafe e veja como o compilador explica que é um comportamento indefinido alterar uma variável estática de várias threads.

  • Usar uma variável estática mutável geralmente é uma má ideia, mas há alguns casos em que isso pode fazer sentido, tais como em código no_std de baixo nível, como implementar um alocador de heap ou trabalhar com algumas APIs C.