Почему постоянные атомарные переменные не обновляются, а статические атомные переменные обновляются? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть этот код:

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));
}

Это печатает 0 0 0 без каких-либо ошибок.В Java я могу использовать final HashMap и добавить (k, v) к нему.В Rust я удивляюсь, что компилятор не кричит на меня, но и не увеличивает мою атомарную стоимость.Я что-то здесь не так делаю?

Если я использую static:

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

, я получаю результат 0 0 10.Почему не работает с const?

1 Ответ

0 голосов
/ 31 мая 2018
Переменная

A 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));

Поскольку каждое значение создается и выбрасывается, никакие изменения от одного к другому не распространяются.

В некотором смысле переменную const можно представить себе как C или C ++ #define - концептуальнозначение просто вставляется везде, где оно используется.

Clippy 0.0.211 имеет в этом случае пух :

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

В Java я могу использоватьfinal HashMap

Да, вы можете очень легко HashMap сделать в Java *1024*.Rust не хочет упрощать создание кода, который может привести к небезопасной памяти.Вам необходимо защитить тип с соответствующей безопасностью, например, Mutex, или вам нужно углубиться в unsafe код, если вы программист гарантируете, что глобальное значение будет когда-либо использоваться только однимthread.

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...