Метод wait класса Barrier
Метод wait класса Barrier блокирует текущий поток
до тех пор, пока все потоки, связанные с данным барьером,
не вызовут этот метод. Когда последний поток достигает барьера,
все ожидающие потоки разблокируются одновременно.
Метод не принимает параметров и возвращает значение типа
BarrierWaitResult.
Синтаксис
barrier.wait()
Пример
Давайте создадим барьер для трёх потоков и посмотрим, как каждый поток ожидает остальных:
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!("Поток {} достиг барьера", i);
b.wait();
println!("Поток {} прошёл барьер", i);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
Результат выполнения кода:
Поток 0 достиг барьера
Поток 1 достиг барьера
Поток 2 достиг барьера
Поток 0 прошёл барьер
Поток 1 прошёл барьер
Поток 2 прошёл барьер
Пример
Давайте используем барьер для синхронизации двух потоков перед выполнением основной работы:
use std::sync::{Arc, Barrier};
use std::thread;
fn main()
{
let barrier = Arc::new(Barrier::new(2));
let mut handles = vec![];
for i in 0..2 {
let b = Arc::clone(&barrier);
let handle = thread::spawn(move || {
println!("Поток {} готовится", i);
b.wait();
println!("Поток {} начал работу", i);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
Результат выполнения кода:
Поток 0 готовится
Поток 1 готовится
Поток 0 начал работу
Поток 1 начал работу
Смотрите также
-
класс
Barrier,
который представляет собой барьер синхронизации потоков -
метод
new,
который создаёт новый барьер для указанного числа потоков -
метод
waitкласса Condvar,
который блокирует поток до получения уведомления -
метод
call_onceкласса Once,
который гарантирует однократное выполнение инициализации