RustのAtomic*
構造体には、fetch_add
のような値を変更する関数があります。なぜRustの `Atomic *`型は値を変更するために変更不可能な関数を使用しますか?
use std::sync::atomic::{AtomicUsize, Ordering};
struct Tester {
counter: AtomicUsize
}
impl Tester {
fn run(&self) {
let counter = self.counter.fetch_add(1, Ordering::Relaxed);
println!("Hi there, this has been run {} times", counter);
}
}
fn main() {
let t = Tester { counter: AtomicUsize::new(0) };
t.run();
t.run();
}
これは、コンパイルし、正常に動作が、私は通常の整数にAtomicUsize
を変更した場合、それは(正しく)による可変性の懸念にコンパイルに失敗します:
struct Tester {
counter: u64
}
impl Tester {
fn run(&self) {
self.counter = self.counter + 1;
println!("Hi there, this has been run {} times", self.counter);
}
}
たとえば、私はこのプログラムを書くことができます
Chris Morgansに加えて、答:あなたは[内部の 'std'文書の中で(いわゆるhttps://doc.rust-lang.org/std/cell/index.html)の内部の変更について読むことができます。 RefCellは別の例です。 –