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

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

Функция new создаёт новый экземпляр Barrier - примитива синхронизации, который позволяет группе потоков ожидать друг друга в определённой точке выполнения. Параметром функция принимает количество потоков, которые должны достичь барьера, прежде чем все они продолжат выполнение.

Синтаксис

Barrier::new(n)

Пример

Давайте создадим барьер для трёх потоков и выведем количество участников:

use std::sync::Barrier; fn main() { let barrier = Barrier::new(3); println!("{:?}", barrier); }

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

Barrier { .. }

Пример

Давайте используем барьер для синхронизации трёх потоков, каждый из которых выведет сообщение до и после барьера:

use std::sync::{Arc, Barrier}; use std::thread; fn main() { let barrier = Arc::new(Barrier::new(3)); let mut handles = vec![]; for i in 0..3 { let b = Arc::clone(&barrier); let handle = thread::spawn(move || { println!("thread {} before barrier", i); b.wait(); println!("thread {} after barrier", i); }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } }

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

thread 0 before barrier thread 1 before barrier thread 2 before barrier thread 0 after barrier thread 1 after barrier thread 2 after barrier

Пример

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

use std::sync::{Arc, Barrier}; use std::thread; use std::time::Duration; fn main() { let barrier = Arc::new(Barrier::new(2)); let b1 = Arc::clone(&barrier); let b2 = Arc::clone(&barrier); let h1 = thread::spawn(move || { println!("first thread is ready"); b1.wait(); println!("first thread continues"); }); let h2 = thread::spawn(move || { thread::sleep(Duration::from_millis(100)); println!("second thread is ready"); b2.wait(); println!("second thread continues"); }); h1.join().unwrap(); h2.join().unwrap(); }

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

first thread is ready second thread is ready first thread continues second thread continues

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

  • класс Barrier,
    который представляет примитив синхронизации потоков
  • метод wait,
    который блокирует поток до достижения барьера
  • метод new класса Condvar,
    который создаёт новый условный переменный примитив
  • метод new класса Once,
    который создаёт примитив однократного выполнения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить