Тип AtomicUsize
Тип AtomicUsize - это атомарный целочисленный тип без знака,
размер которого соответствует размеру указателя на текущей платформе.
Он обеспечивает атомарный доступ к значению из нескольких потоков
без использования мьютексов. Все операции над этим типом выполняются
неделимо, что исключает гонки данных. Параметром методов обычно
выступает значение типа usize и порядок доступа
Ordering, определяющий модель синхронизации памяти.
Синтаксис
use std::sync::atomic::AtomicUsize;
let atomic = AtomicUsize::new(0);
Пример
Давайте создадим атомарный счётчик и увеличим его значение из основного потока:
use std::sync::atomic::{AtomicUsize, Ordering};
fn main()
{
let counter = AtomicUsize::new(0);
counter.fetch_add(1, Ordering::SeqCst);
counter.fetch_add(1, Ordering::SeqCst);
let res = counter.load(Ordering::SeqCst);
println!("{}", res);
}
Результат выполнения кода:
2
Пример
Давайте разделим атомарный счётчик между несколькими потоками и увеличим его значение в каждом из них:
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
use std::thread;
fn main()
{
let counter = Arc::new(AtomicUsize::new(0));
let mut handles = vec![];
for _ in 0..3 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
counter.fetch_add(1, Ordering::SeqCst);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let res = counter.load(Ordering::SeqCst);
println!("{}", res);
}
Результат выполнения кода:
3
Пример
Давайте сравним текущее значение с ожидаемым и заменим его только при совпадении:
use std::sync::atomic::{AtomicUsize, Ordering};
fn main()
{
let value = AtomicUsize::new(5);
let res = value.compare_exchange(
5,
10,
Ordering::SeqCst,
Ordering::SeqCst
);
println!("{:?}", res);
println!("{}", value.load(Ordering::SeqCst));
}
Результат выполнения кода:
Ok(5)
10
Смотрите также
-
тип
AtomicBool,
который представляет атомарный логический тип -
тип
AtomicI32,
который представляет атомарное 32-битное целое со знаком -
метод
load,
который атомарно читает текущее значение -
метод
fetch_add,
который атомарно прибавляет значение к текущему