为什么Rust的`Atomic*`类型使用非可变函数来改变值?

Ron*_*ith 9 rust

我注意到Rust的Atomic*结构具有修改值的功能,例如fetch_add.例如,我可以写这个程序:

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();
}
Run Code Online (Sandbox Code Playgroud)

这编译并运行正常,但如果我将其更改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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*gan 13

如果它不以这种方式工作就不会有用.有了&mut引用,一次只能存在一个,并且当时没有&引用,所以整个操作原子性问题都没有实际意义.

查看它的另一种方法&mut唯一引用和可& 别的引用.对于普通类型,只有具有唯一引用才能安全地发生变异,但原子类型都是关于变异(通过替换)而不需要唯一引用.

命名&并且&mut一直是一个充满争议的问题,在社区中存在很多恐惧,不确定和怀疑,以及像" 关注所有权"这样的文件解释事物的实际情况.该语言已经结束了住&&mut,但&mut实际上是对独特性,而不是可变性(这只是大多数的时候两者是等价的).