我有这个代码:
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- 从概念上讲,只要将值粘贴到任何地方,它就会被粘贴.
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如果程序员保证只有一个线程可以使用全局值,则需要深入代码.
也可以看看:
| 归档时间: |
|
| 查看次数: |
459 次 |
| 最近记录: |