Несталі статичні змінні
Читати незмінну статичну змінну безпечно:
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.