РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1104 of 1245 menu

Тип 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,
    который атомарно прибавляет значение к текущему
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить