Функция 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