2016-09-12 1 views
5

Что не так с этим кодом?const fns - неустойчивая функция при использовании AtomicUsize :: new

use std::sync::atomic::AtomicUsize; 

static mut counter: AtomicUsize = AtomicUsize::new(0); 

fn main() {} 

Я получаю эту ошибку:

error: const fns are an unstable feature 
--> src/main.rs:3:35 
    |> 
3 |> static mut counter: AtomicUsize = AtomicUsize::new(0); 
    |>         ^^^^^^^^^^^^^^^^^^^ 
help: in Nightly builds, add `#![feature(const_fn)]` to the crate attributes to enable 

Документов отметить, что другие атомные ИНТЫ размеров являются нестабильными, но, по-видимому AtomicUsize стабильный.

Целью этого является получение атомарного счетчика для каждого процесса.

+3

Атомный не нужно и не должен находиться в «статическом муте», он должен быть в простой «статической». При их модификации при использовании атомных операций используется внутренняя изменчивость. Вы видите, что все их мутирующие методы используют '& self' в качестве первого аргумента (общая ссылка). – bluss

+1

Ах да, это имеет смысл, потому что им не нужно полагаться на проверку чека. – Timmmm

ответ

9

Да, вы не можете вызывать функции вне функции, начиная с Rust 1.10. Для этого требуется еще не стабильная функция: постоянная функция оценки.

Вы можете инициализировать атомарную переменную в ноль с помощью ATOMIC_USIZE_INIT (или соответствующий вариант):

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

static COUNTER: AtomicUsize = ATOMIC_USIZE_INIT; 

fn main() {} 

Как bluss points out, нет никакой необходимости, чтобы сделать этот изменчивый. И, как указывает компилятор, значения static и const должны быть в SCREAMING_SNAKE_CASE.

Смежные вопросы