Всем привет! Сегодня хочу поговорить про барьеры для синхронизации потоков в
Rust и в очередной раз произвести сравнение со
Swift.
Пример работы с барьерами в Rust:
В
Rust потоки блокируются на барьере и ждут, пока все достигнут определенной точки выполнения. Есть риск вечной блокировкой, если поток не дойдет до барьера.
use std::sync::{Arc, Barrier};
use std::thread;
use std::time::Duration;
let barrier = Arc::new(Barrier::new(3)); // Ожидаем 3 потока
let mut handles = vec![];
// Запускаем 3 параллельные задачи
for i in 1..=3 {
let barrier = Arc::clone(&barrier);
let handle = thread::spawn(move || {
// Имитируем асинхронную работу
thread::sleep(Duration::from_secs(i));
println!("Задача {} выполнена", i);
// Ждем завершения всех задач
barrier.wait();
});
handles.push(handle);
}
// Ждем завершения всех потоков
for handle in handles {
handle.join().unwrap();
}
println!("Все задачи завершены!");
Аналогичная логика при использовании DispatchGroup в Swift:
В
Swift с использованием
DispatchGroup есть ручное управление, где каждая задача самостоятельно уведомляет о своем завершении, но можно забыть вызвать
leave() и получить зависшее приложение.
let group = DispatchGroup()
// Запускаем 3 параллельные задачи
for i in 1...3 {
group.enter()
// Имитируем асинхронную работу
DispatchQueue.global().asyncAfter(deadline: .now() + Double(i)) {
print("Задача \(i) выполнена")
group.leave()
}
}
// Ждем завершения всех задач
group.notify(queue: .main) {
print("Все задачи завершены!")
}
Swift более гибкий для асинхронных сценариев, а
Rust безопаснее для синхронной многопоточности. Оба инструмента мощные, но для разных задач!