为什么const原子变量没有更新,但静态原子变量是?

mis*_*___ 15 rust

我有这个代码:

use std::sync::atomic::{AtomicUsize, Ordering};

const SOME_VAR: AtomicUsize = AtomicUsize::new(0);

fn main() {
    println!("{}", SOME_VAR.load(Ordering::SeqCst));
    println!("{}", SOME_VAR.fetch_add(10, Ordering::SeqCst));
    println!("{}", SOME_VAR.load(Ordering::SeqCst));
}
Run Code Online (Sandbox Code Playgroud)

这打印0 0 0没有任何错误.在Java中,我可以使用a final HashMap并添加(k, v)它.在Rust中,我很惊讶编译器没有对我大喊大叫,但也没有增加我的原子值.我在这里做错了吗?

如果我使用static:

static SOME_VAR: AtomicUsize = AtomicUsize::new(0);
Run Code Online (Sandbox Code Playgroud)

我得到了结果0 0 10.为什么它不起作用const

She*_*ter 15

一个static变量是保证有一个实例,你可以采取一个参考吧.一个const变量没有这个保证,编译器允许有它的零个,一个或多个实例.

在您的情况下,代码相当于:

println!("{}", AtomicUsize::new(0).load(Ordering::SeqCst));
println!("{}", AtomicUsize::new(0).fetch_add(10, Ordering::SeqCst));
println!("{}", AtomicUsize::new(0).load(Ordering::SeqCst));
Run Code Online (Sandbox Code Playgroud)

由于每个值都是创建并丢弃的,因此不会从一个值传播到另一个值.

在某些方面,您可以考虑const像C或C++这样的变量#define- 从概念上讲,只要将值粘贴到任何地方,它就会被粘贴.

Clippy 0.0.211对于这种情况有一个lint:

error: a const item should never be interior mutable
 --> src/main.rs:3:1
  |
3 | const SOME_VAR: AtomicUsize = AtomicUsize::new(0);
  | -----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  | |
  | help: make this a static item: `static`
  |
  = note: #[deny(declare_interior_mutable_const)] on by default
  = help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.211/index.html#declare_interior_mutable_const

error: a const item with interior mutability should not be borrowed
 --> src/main.rs:6:20
  |
6 |     println!("{}", SOME_VAR.load(Ordering::SeqCst));
  |                    ^^^^^^^^
  |
  = note: #[deny(borrow_interior_mutable_const)] on by default
  = help: assign this const to a local or static variable, and use the variable here
  = help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.211/index.html#borrow_interior_mutable_const
Run Code Online (Sandbox Code Playgroud)

在Java中,我可以使用 final HashMap

是的,您可以非常轻松地在Java中创建非线程安全的 HashMap.Rust不希望创建可能导致内存不安全的代码.您需要以适当的安全性保护类型,例如a Mutex,或者unsafe如果程序员保证只有一个线程可以使用全局值,则需要深入代码.

也可以看看: