Несталі статичні змінні

Читати незмінну статичну змінну безпечно:

static HELLO_WORLD: &str = "Привіт, світ!";

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

Однак, оскільки можуть відбуватися перегони даних, небезпечно читати і записувати статичні змінні, що мутуються:

static mut COUNTER: u32 = 0;

fn add_to_counter(inc: u32) {
    // БЕЗПЕКА: Немає інших потоків, які могли б отримати доступ до `COUNTER`.
    unsafe {
        COUNTER += inc;
    }
}

fn main() {
    add_to_counter(42);

    // БЕЗПЕКА: Немає інших потоків, які могли б отримати доступ до `COUNTER`.
    unsafe {
        println!("COUNTER: {COUNTER}");
    }
}
This slide should take about 5 minutes.
  • Програма тут безпечна, оскільки вона однопотокова. Однак компілятор Rust є консервативним і припускає найгірше. Спробуйте видалити unsafe і подивіться, як компілятор пояснює, що мутація статики з кількох потоків є невизначеною поведінкою.

  • Використання мутабельної статики, як правило, погана ідея, але є деякі випадки, коли це може мати сенс у низькорівневому коді no_std, наприклад реалізація розподілювача купи або робота з деякими API C.