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

Функция new класса Once

Функция new класса Once создаёт новый экземпляр примитива Once. Класс Once представляет собой примитив синхронизации, который гарантирует, что некоторая инициализация будет выполнена ровно один раз, даже если к ней одновременно обращаются несколько потоков. Функция не принимает параметров и возвращает значение типа Once. Созданный экземпляр доступен для использования в статических переменных и в многопоточном контексте.

Синтаксис

Once::new()

Пример

Давайте создадим экземпляр Once и выполним инициализацию через метод call_once:

use std::sync::Once; static INIT: Once = Once::new(); fn main() { INIT.call_once(|| { println!("initialized"); }); INIT.call_once(|| { println!("this will not be printed"); }); }

Результат выполнения кода:

initialized

Пример

Давайте создадим локальную переменную типа Once и проверим, что инициализация выполняется только один раз:

use std::sync::Once; fn main() { let once = Once::new(); let mut counter = 0; once.call_once(|| { counter += 1; }); once.call_once(|| { counter += 1; }); println!("{}", counter); }

Результат выполнения кода:

1

Пример

Давайте используем Once в многопоточном приложении, чтобы гарантировать однократную инициализацию общего ресурса:

use std::sync::{Arc, Once}; use std::thread; fn main() { let once = Arc::new(Once::new()); let mut handles = vec![]; for i in 0..5 { let once = Arc::clone(&once); let handle = thread::spawn(move || { once.call_once(|| { println!("init from thread {}", i); }); }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } }

Возможный результат выполнения кода:

init from thread 0

Смотрите также

  • класс Once,
    который представляет примитив однократного выполнения
  • метод call_once,
    который выполняет замыкание ровно один раз
  • класс OnceLock,
    который хранит значение, инициализируемое однократно
  • метод get_or_init,
    который возвращает значение, инициализируя его при необходимости
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить