gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:44:24 25 4
gpt4 key购买 nike

我注意到 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();
}

这编译并运行良好,但如果我将 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);
}
}

最佳答案

如果它以这种方式工作,它就不会很有用。对于 &mut 引用,一次只能存在一个,并且此时没有 & 引用,因此整个操作的原子性问题将没有实际意义。

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

&&mut 的命名一直是一件令人担忧的事情,社区和文档(如Focusing on Ownership)充满恐惧、不确定和怀疑。解释事情的实际情况。该语言最终保留了 &&mut,但 &mut 实际上是关于唯一性而不是可变性(只是大多数时候两个是等价的)。

关于rust - 为什么 Rust 的 `Atomic*` 类型使用不可变函数来改变值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35810843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com