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