可変なstatic変数

不変の静的変数は安全に読み取ることができます。

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 を削除すると、複数のスレッドから静的変数を変更することは未定義の動作であることを説明するメッセージがコンパイラにより表示されるはずです。

  • 一般的に、可変静的変数を使用することはおすすめしませんが、ヒープ アロケータの実装や一部の C API の操作など、低レベルの no_std コードでは適している場合もあります。