Добавить объявление

Сравнение барьеров в Rust и Swift

Всем привет! Сегодня хочу поговорить про барьеры для синхронизации потоков в 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 безопаснее для синхронной многопоточности. Оба инструмента мощные, но для разных задач!
30.10.2025 13 175